2012-02-10 4 views
2

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

Так что я пытаюсь создать следующее:

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 

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

+0

Как вы можете использовать 'System.IO.FileAttributes' в коде VBA? Этот оператор Dim вызывает ошибку компилятора в моей системе. – HansUp

+2

Чтобы следить за комментарием @ HansUp: код, который вы написали, - код VB.NET; VBA основан на VB 6, который является совершенно другим животным. – phoog

ответ

3

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

Работал как шарм! Спасибо за помощь :) –

Смежные вопросы