Я пытаюсь проверить все разрешения, которые могу, чтобы люди могли выбрать любой файл, и до того, как он выйдет из строя позже в программе, они могут получить сообщение об ошибке, которое напрямую отвечает на то, почему они не могут сохранить в этом месте. Две из них, которые я рассмотрел прямо сейчас, это «Папка не выбрана» и «Этот файл НЕ существует». Сказать, что это только для чтения, не работает, и если у кого-то есть какие-либо полезные советы, которые были бы очень признательны, или какие-либо идеи о дополнительных проверках, которые я мог бы сделать с файлами. Я тестирую его, используя файл программных файлов на моем компьютере.
Sub CreateFile()
Dim BaseDirectory As String
Dim FS As FileSystemObject
Set FS = New FileSystemObject
BaseDirectory = GetFolder()
If (BaseDirectory = vbNullString) Then
MsgBox "No Folder Selected", vbExclamation, "Error"
GoTo EndProgram
End If
'Not Working
With FS.GetFolder(BaseDirectory)
If (.Attributes And ReadOnly) Then
MsgBox .Name & " is readonly!"
GoTo EndProgram
End If
End With
If Len(Dir(BaseDirectory)) = 0 Then
MsgBox "This file does NOT exist."
GoTo EndProgram
End If
EndProgram:
End Sub
Function GetFolder() As String
Dim fldr As FileDialog
Dim sItem As String
Set fldr = Application.FileDialog(msoFileDialogFolderPicker)
With fldr
.Title = "Select a Folder"
.AllowMultiSelect = False
.InitialFileName = Application.DefaultFilePath
If .Show <> -1 Then GoTo NextCode
sItem = .SelectedItems(1)
End With
NextCode:
GetFolder = sItem
Set fldr = Nothing
End Function
Я ожидаю, что это скажет .Name только для чтения!, но это не работает в .attributes и только для чтения. Просто пишет, что этот файл НЕ существует
Да, я пытаюсь убедиться, что у него есть права на запись в папку, чтобы не возникло осложнений, когда он выберет одну, и если он выберет неправильную, он будет знать, почему она не работает. Я добавил .ReadOnly, и это дало мне ошибку компиляции: метод или элемент данных не найден
Вот функция, которая проверяет, есть ли у текущего пользователя права на запись в папку. Он работает, создавая временный файл в этой папке для записи, и если он сможет его создать, он вернет true. В противном случае эта функция вернет false.
'CHECK TO SEE IF CURRENT USER HAS WRITE ACCESS TO FOLDER
Public Function HasWriteAccessToFolder(ByVal FolderPath As String) As Boolean
'@example: HasWriteAccessToFolder("C:\Program Files") -> True || False
'MAKE SURE FOLDER EXISTS, THIS FUNCTION RETURNS FALSE IF IT DOES NOT
Dim Fso As Scripting.FileSystemObject
Set Fso = New Scripting.FileSystemObject
If Not Fso.FolderExists(FolderPath) Then
Exit Function
End If
'GET UNIQUE TEMP FilePath, DON'T WANT TO OVERWRITE SOMETHING THAT ALREADY EXISTS
Do
Dim Count As Integer
Dim FilePath As String
FilePath = Fso.BuildPath(FolderPath, "TestWriteAccess" & Count & ".tmp")
Count = Count + 1
Loop Until Not Fso.FileExists(FilePath)
'ATTEMPT TO CREATE THE TMP FILE, ERROR RETURNS FALSE
On Error GoTo Catch
Fso.CreateTextFile(FilePath).Write ("Test Folder Access")
Kill FilePath
'NO ERROR, ABLE TO WRITE TO FILE; RETURN TRUE!
HasWriteAccessToFolder = True
Catch:
End Function
Использовать функцию? Я использую VBS (не VBA), но кому-то это может оказаться полезным. Если вы запускаете команды fso по пути, который не существует, или проблема с разрешениями, она вернет функцию и код ошибки, используйте это, чтобы определить, есть ли у пользователя доступ к этой папке:
'VBS Example:
Function TestDirectory(FullDirPath)
'Purpose: test creation, if path doesn't exist or permissions issue, function will return error code
strDir = fso.GetAbsolutePathName(FullDirPath)
strDir = strDir & "\_randfoldercrtplsdelthis"
fso.CreateFolder strDir
If fso.FolderExists(strDir) Then
fso.DeleteFolder strDir, TRUE
End If
End Function
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set Shell = CreateObject("WScript.Shell")
FilePath = "C:\Restricted Start Menu Locked\"
If TestDirectory(FilePath) <> 0 Then
WScript.Echo "Folder Access Denied? Error = " & Err.Number
Else
WScript.Echo "Woot!"
End If
Похоже, вам не хватает точки в выражении If, она должна быть
.ReadOnly
. Вы ищете, есть ли у пользователя права на запись в папку?