Подтвердить что ты не робот

Использование VBA для получения расширенных атрибутов файла

Попытка использовать Excel VBA для захвата всех атрибутов файла из файлов на диске, включая расширенные атрибуты. Он смог заставить его зациклиться на файлах и захватить основные атрибуты (которые поступают из файловой системы):

  • Путь к файлу
  • Имя файла
  • Размер файла
  • Дата создания
  • Дата последнего доступа
  • Дата последнего изменения.
  • Тип файла

Также хотелось бы захватить расширенные свойства, которые поступают из самого файла:

  • Автор
  • Ключевые слова
  • Комментарии
  • Последний автор
  • Категория
  • Тема

И другие свойства, которые видны при щелчке правой кнопкой мыши по файлу.

Цель состоит в том, чтобы создать подробный список всех файлов на файловом сервере.

4b9b3361

Ответ 1

Вы говорите, что цикл... так что если вы хотите сделать это для dir вместо текущего документа;

Dim sFile As Variant
Dim oShell: Set oShell = CreateObject("Shell.Application")
Dim oDir:   Set oDir = oShell.Namespace("c:\foo")

For Each sFile In oDir.Items
   Debug.Print oDir.GetDetailsOf(sFile, XXX) 
Next

Где XXX - индекс столбца атрибута, например 9 для автора. Чтобы перечислить доступные индексы для вашей справки, вы можете заменить цикл for на;

for i = 0 To 40
   debug.? i, oDir.GetDetailsOf(oDir.Items, i)
Next

Быстро для одного файла/атрибута:

Const PROP_COMPUTER As Long = 56

With CreateObject("Shell.Application").Namespace("C:\HOSTDIRECTORY")
    MsgBox .GetDetailsOf(.Items.Item("FILE.NAME"), PROP_COMPUTER)
End With

Ответ 2

Вы можете получить это с помощью .BuiltInDocmementProperties.

Например:

Public Sub PrintDocumentProperties()
    Dim oApp As New Excel.Application
    Dim oWB As Workbook
    Set oWB = ActiveWorkbook

    Dim title As String
    title = oWB.BuiltinDocumentProperties("Title")

    Dim lastauthor As String
    lastauthor = oWB.BuiltinDocumentProperties("Last Author")

    Debug.Print title
    Debug.Print lastauthor
End Sub

Смотрите эту страницу для всех полей, к которым вы можете получить доступ: http://msdn.microsoft.com/en-us/library/bb220896.aspx

Если вы пытаетесь сделать это за пределами клиента (например, с закрытым и выполняемым кодом Excel, скажем, с помощью .NET-программы), вам нужно использовать DSOFile.dll.

Ответ 3

'vb.net
'Extended file stributes
'visual basic .net sample 

Dim sFile As Object
        Dim oShell = CreateObject("Shell.Application")
        Dim oDir = oShell.Namespace("c:\temp")

        For i = 0 To 34
            TextBox1.Text = TextBox1.Text & oDir.GetDetailsOf(oDir, i) & vbCrLf
            For Each sFile In oDir.Items
                TextBox1.Text = TextBox1.Text & oDir.GetDetailsOf(sFile, i) & vbCrLf
            Next
            TextBox1.Text = TextBox1.Text & vbCrLf
        Next

Ответ 4

Я наконец смог заставить это работать, используя позднюю привязку и ссылку на эту ссылку: https://docs.microsoft.com/en-us/windows/win32/shell/folder-getdetailsof. Коды атрибутов были разными на моем компьютере и, как кто-то из упомянутых выше, большинство возвращали пустые значения, даже если это не так. Я использовал цикл for для их циклического просмотра и обнаружил, что к заголовку и теме все еще можно получить доступ, чего более чем достаточно для моих целей.

Private Sub MySubNamek()
Dim objShell  As Object 'Shell
Dim objFolder As Object 'Folder

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace("E:\MyFolder")

If (Not objFolder Is Nothing) Then
Dim objFolderItem As Object 'FolderItem
Set objFolderItem = objFolder.ParseName("Myfilename.txt")
        For i = 0 To 288
           szItem = objFolder.GetDetailsOf(objFolderItem, i)
           Debug.Print i & " - " & szItem
       Next
Set objFolderItem = Nothing
End If

Set objFolder = Nothing
Set objShell = Nothing
End Sub