Как проверить, есть ли у пользователя права на запись в папку?

Я пытаюсь проверить все разрешения, которые могу, чтобы люди могли выбрать любой файл, и до того, как он выйдет из строя позже в программе, они могут получить сообщение об ошибке, которое напрямую отвечает на то, почему они не могут сохранить в этом месте. Две из них, которые я рассмотрел прямо сейчас, это «Папка не выбрана» и «Этот файл НЕ существует». Сказать, что это только для чтения, не работает, и если у кого-то есть какие-либо полезные советы, которые были бы очень признательны, или какие-либо идеи о дополнительных проверках, которые я мог бы сделать с файлами. Я тестирую его, используя файл программных файлов на моем компьютере.

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 и только для чтения. Просто пишет, что этот файл НЕ существует

Похоже, вам не хватает точки в выражении If, она должна быть .ReadOnly. Вы ищете, есть ли у пользователя права на запись в папку?

Robert Todar 13.06.2019 17:39

Да, я пытаюсь убедиться, что у него есть права на запись в папку, чтобы не возникло осложнений, когда он выберет одну, и если он выберет неправильную, он будет знать, почему она не работает. Я добавил .ReadOnly, и это дало мне ошибку компиляции: метод или элемент данных не найден

Hakon 13.06.2019 17:43
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
2
2 136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот функция, которая проверяет, есть ли у текущего пользователя права на запись в папку. Он работает, создавая временный файл в этой папке для записи, и если он сможет его создать, он вернет 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 

Другие вопросы по теме