Как проверить шифрование файлов в VBA (MSAccess) - PullRequest
2 голосов
/ 10 февраля 2012

Я создаю форму, которая перемещает файлы из одного места в другое на основе данных в БД, и это работает, пока исходный файл не зашифрован (зеленое имя файла в проводнике Windows) и пока файл назначенияне существует.

Поэтому я пытаюсь создать следующее:

Public Function isEncrypted(file As String) As Boolean
    Dim info As System.IO.FileInfo
    info = My.Computer.FileSystem.GetFileInfo(file)

    Dim attr As System.IO.FileAttributes
    attr = info.Attributes

    isEncrypted = ((attr And System.IO.FileAttributes.Encrypted) > 0)
End Function

Но оно не запускается вообще.Кто-нибудь имеет опыт с этим, или есть более простой способ проверить шифрование?Access зависает и падает при попытке переименовать и переместить зашифрованный файл.

1 Ответ

3 голосов
/ 10 февраля 2012

Как уже упоминали другие, код vb.net не будет компилироваться при доступе. Скорее всего, вам потребуется системный вызов win32 для получения атрибутов файла. Объект FileSystemObject (Scrrun.dll «Windows Scripting Runtime») также не будет работать, так как его перечисление не сообщит вам, зашифрован ли файл. Вот функция Windows API, которую вы можете использовать, чтобы определить, зашифрован файл или нет.

Public Enum FileAttribute
'uses VBA Hex Notation
    FILE_ATTRIBUTE_READONLY = &H1
    FILE_ATTRIBUTE_HIDDEN = &H2
    FILE_ATTRIBUTE_SYSTEM = &H4
    FILE_ATTRIBUTE_DIRECTORY = &H10
    FILE_ATTRIBUTE_ARCHIVE = &H20
    FILE_ATTRIBUTE_DEVICE = &H40
    FILE_ATTRIBUTE_NORMAL = &H80
    FILE_ATTRIBUTE_TEMPORARY = &H100
    FILE_ATTRIBUTE_SPARSE_FILE = &H200
    FILE_ATTRIBUTE_REPARSE_POINT = &H400
    FILE_ATTRIBUTE_COMPRESSED = &H800
    FILE_ATTRIBUTE_OFFLINE = &H1000
    FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = &H2000
    FILE_ATTRIBUTE_ENCRYPTED = &H4000
    FILE_ATTRIBUTE_VIRTUAL = &H10000
End Enum

Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long

Public Sub Test()

    Dim fileTestPath As String
    Dim attributes As Long

    fileTestPath = "C:\yourfile.txt"

    attributes = GetFileAttributes(fileTestPath)

    'uses bitwise AND calculations to determine values
    If (attributes And FileAttribute.FILE_ATTRIBUTE_ARCHIVE) Then Debug.Print "Archive"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_COMPRESSED) Then Debug.Print "Compressed"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_DEVICE) Then Debug.Print "Device"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_DIRECTORY) Then Debug.Print "Directory"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_ENCRYPTED) Then Debug.Print "Encrypted"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_HIDDEN) Then Debug.Print "Hidden"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_NORMAL) Then Debug.Print "Normal"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) Then Debug.Print "Not Content Indexed"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_OFFLINE) Then Debug.Print "Offline"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_READONLY) Then Debug.Print "ReadOnly"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_REPARSE_POINT) Then Debug.Print "ReparsePoint"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_SPARSE_FILE) Then Debug.Print "SparseFile"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_SYSTEM) Then Debug.Print "System"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_TEMPORARY) Then Debug.Print "Temporary"
    If (attributes And FileAttribute.FILE_ATTRIBUTE_VIRTUAL) Then Debug.Print "Virtual"

End Sub
...