Как проверить шифрование файлов в VBA (MSAccess)

Я создаю форму, которая перемещает файлы из одного места в другое на основе данных в БД и работает до тех пор, пока исходный файл не зашифрован (зеленое имя файла в проводнике 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

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

1 ответ

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

licensed under cc by-sa 3.0 with attribution.