Avatar of Cynthia Hill
Cynthia Hill
Flag for United States of America asked on

Mark Multiple Databases as Read Only at one time with VB

Hello - What would code look like for me to set properties of multiple db's to Read Only at one time?  

For example, if I have a "Set Read Only" db that stored code I could run...and have it mark DB1, DB2, and DB3 as read only...?
VB ScriptMicrosoft Access

Avatar of undefined
Last Comment
aikimark

8/22/2022 - Mon
Surone1

just to be clear you want to set the read-only filesystem property of multiple .mdb files?
aikimark

You can do this with one Attrib command, since it allows you to use wildcards.

You can easily invoke this with the Shell function or using the Wscript.shell object's Run method.
Surone1

i would have suggested Scripting.FileSystemObject but work got in the way. if you need details on how to make either of those work let us know.
Your help has saved me hundreds of hours of internet surfing.
fblack61
Cynthia Hill

ASKER
Okay...that helps to get me going.  I've never modified file properties in VB before, so this function is new to me.  

Would the code look something like this (see below)?  Feel free to simplify if I've added in things that are not necessary.
Function ToggleReadOnly()
   Dim fso, f
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFile(c:\DB1)
   If f.attributes and 1 Then
      f.attributes = f.attributes - 1
      ToggleReadOnly = "Databases are Read/Write."
   Else
      f.attributes = f.attributes + 1
      ToggleReadOnly = "Databases are Read Only."
   End If
End Function

Open in new window

ASKER CERTIFIED SOLUTION
Surone1

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Cynthia Hill

ASKER
Great - Thanks!

I will play with that today and to verify it works for me.

Question: If I wanted to make a second function to make teh databases read/write without checking (so basically the opposite of the other function)...would I simply change the line of code listed as "f.Attributes = f.Attributes + 1" (READ ONLY method) to "f.Attributes = f.Attributes -1" (READ WRITE method???)  Changing the "+ 1" to a "- 1"?  Would that do the trick?
Surone1

yes it should
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
aikimark

Beware that if you run this against the same set of files twice, you will remove the read-only attribute.
Surone1

aikimark is right. it also seems to affect the hidden property so we put the check back in:



 Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("c:\DB1.mdb")
 If f.Attributes And 1 Then
       Else
    f.Attributes = f.Attributes + 1
end if
    Set f = Nothing
  Set f = fso.GetFile("c:\DB2.mdb")
 If f.Attributes And 1 Then
       Else
    f.Attributes = f.Attributes + 1
end if
    Set f = Nothing
   Set fso = Nothing


and



 Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("c:\DB1.mdb")
 If f.Attributes And 1 Then
  f.Attributes = f.Attributes - 1
       Else
 
end if
    Set f = Nothing
  Set f = fso.GetFile("c:\DB2.mdb")
 If f.Attributes And 1 Then
  f.Attributes = f.Attributes - 1
       Else
   
end if
    Set f = Nothing
   Set fso = Nothing
Cynthia Hill

ASKER
Yeah...I noticed that it wanted to mark the DBs hidden if I ran it more than once.  

Below is what I came up with...instead of adding or subtracting a number to the exisitng Attritbute property...just set it to the settign I want (e.g. from  f.Attributes = f.Attributes + 1 to  f.Attributes = 1)

Do you see any reason why this will not work?  Seems to work when testing.


Function DBS_ReadOnly()
Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("H:\TEST\db1.accdb")
    f.Attributes = 1
    Set f = Nothing
  Set f = fso.GetFile("H:\TEST\db2.accdb ")
    f.Attributes = 1
   Set fso = Nothing
End Function

Function DBS_ReadWrite()
Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("H:\TEST\db1.accdb")
    f.Attributes = 0
    Set f = Nothing
  Set f = fso.GetFile("H:\TEST\db2.accdb ")
    f.Attributes = 0
    Set f = Nothing
   Set fso = Nothing
End Function

Open in new window

Experts Exchange is like having an extremely knowledgeable team sitting and waiting for your call. Couldn't do my job half as well as I do without it!
James Murphy
aikimark

Instead of using addition, use the AND boolean operator to flip the one bit.

Have you considered my suggestion of the use of the Attrib command?
Cynthia Hill

ASKER
aikimark - is there a reason why this wouldn't work...or is not a "correct" option to go with?  

settign the attribute to the exact setting I want (e.g. Attributes = 1 or Attributes = 0)?  


Function DBS_ReadOnly()
Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("H:\TEST\db1.accdb")
    f.Attributes = 1
    Set f = Nothing
  Set f = fso.GetFile("H:\TEST\db2.accdb ")
    f.Attributes = 1
   Set fso = Nothing
End Function

Function DBS_ReadWrite()
Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.GetFile("H:\TEST\db1.accdb")
    f.Attributes = 0
    Set f = Nothing
  Set f = fso.GetFile("H:\TEST\db2.accdb ")
    f.Attributes = 0
    Set f = Nothing
   Set fso = Nothing
End Function
aikimark

As written, you are setting the Attributes of these files without any regard to other attributes, such as archive-needed.

Earlier comment correction:  The OR boolean operator should be used, not the AND operator.
⚡ FREE TRIAL OFFER
Try out a week of full access for free.
Find out why thousands trust the EE community with their toughest problems.
Cynthia Hill

ASKER
aikimark - can you show me an example of what the code would look like if using the Attrib command?
aikimark

attrib +r H:\TEST\db*.accdb

Open in new window