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

#vba #file-attributes #fso

#vba #file-attributes #fso

Вопрос:

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

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

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

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

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

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

Ответ №1:

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

 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
  

Комментарии:

1. Также смотрите сайт Microsoft: technet.microsoft.com/en-us/library/ee176615.aspx

2. Для тех, кто направлен сюда, это немного устарело. Теперь вы можете использовать 288 атрибутов. Например, версия файла 271. Обновите цикл for, чтобы увидеть их все. msdn.microsoft.com/en-us/library/windows/desktop /…

3. Дальнейшее обновление: по состоянию на некоторое время прошлым летом (2017) все индексы выше 6 недействительны, возвращая только пустые строки.

Ответ №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.

Комментарии:

1. Мой вопрос был не очень ясен. Я пытаюсь захватить атрибуты файла из файлов на диске. Похоже, что это считывание свойств из открытого документа. Как бы я получил свойства из файла на диске?

2. Ах, это было помечено как Excel-VBA, поэтому я подумал, что вы хотите сделать это изнутри клиента. Для работы вне клиента (т. Е. чтения с диска) вы бы использовали DSOFile.dll (последний абзац в моем ответе).

3. Изменены теги, поскольку это не имеет ничего общего с Excel.

Ответ №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 amp; oDir.GetDetailsOf(oDir, i) amp; vbCrLf
            For Each sFile In oDir.Items
                TextBox1.Text = TextBox1.Text amp; oDir.GetDetailsOf(sFile, i) amp; vbCrLf
            Next
            TextBox1.Text = TextBox1.Text amp; vbCrLf
        Next
  

Ответ №4:

Я, наконец, смог заставить это работать для моих нужд.

Старый одобренный код не запускается в системе Windows 10 (по крайней мере, не в моей). Приведенная ниже ссылка на библиотеку MS предоставляет текущие примеры того, как заставить это работать. В моем примере они используются с поздними привязками.

https://learn.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 amp; " - " amp; szItem
       Next
Set objFolderItem = Nothing
End If

Set objFolder = Nothing
Set objShell = Nothing
End Sub
  

Комментарии:

1. Есть другие ответы, которые задают вопрос OP, и они были опубликованы некоторое время назад. При публикации ответа, пожалуйста, убедитесь, что вы добавили либо новое решение, либо существенно лучшее объяснение, особенно при ответе на старые вопросы.

2. Хорошо, я думал, что выразился ясно. Старый одобренный код не запускается в системе Windows 10 (по крайней мере, не в моей). Упомянутая выше ссылка на библиотеку MS предоставляет текущие примеры того, как заставить это работать. В моем примере они используются с поздними привязками.

3. Пожалуйста, проверьте мою правку — итак, мы должны удалить наши комментарии для очистки.

Ответ №5:

Удачное открытие

если objFolderItem ничего не происходит, когда вы вызываете

 objFolder.GetDetailsOf(objFolderItem, i)
  

возвращаемая строка — это имя свойства, а не его (неопределенное) значение
например, когда i=3 он возвращает «Дата изменена»

Выполнение этого для всех 288 значений I проясняет, почему большинство из них возвращают пустое значение для большинства типов файлов, например, i=175 «Горизонтальное разрешение»

Комментарии:

1. пожалуйста, уточните