23

尝试使用 Excel VBA 从磁盘上的文件中捕获所有文件属性,包括扩展属性。能够让它遍历文件并捕获基本属性(来自文件系统):

  • 文件路径
  • 文件名
  • 文件大小
  • 创建日期
  • 上次访问日期
  • 上次修改日期
  • 文件类型

还想捕获来自文件本身的扩展属性:

  • 作者
  • 关键词
  • 评论
  • 最后作者
  • 类别
  • 学科

以及右键单击文件时可见的其他属性。

目标是创建文件服务器上所有文件的详细列表。

4

5 回答 5

25

你说循环 .. 所以如果你想为一个目录而不是当前文档做这个;

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 是属性列索引,例如 Author 为 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
于 2011-04-13T16:20:53.533 回答
8

你可以用.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

于 2011-04-13T15:57:15.177 回答
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
于 2016-06-02T17:05:25.977 回答
2

我终于能够让它满足我的需求。

旧的投票代码无法在 Windows 10 系统上运行(至少不是我的)。下面引用的 MS 库链接提供了有关如何使其工作的当前示例。我的示例将它们与后期绑定一起使用。

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
于 2019-10-01T19:41:35.117 回答
1

幸运的发现

如果objFolderItem你打电话时什么都没有

objFolder.GetDetailsOf(objFolderItem, i)

返回的字符串是属性的名称,而不是其(未定义的)值,例如当i=3它返回“修改日期”时

对 I 的所有 288 个值执行此操作可以清楚地说明为什么大多数文件类型会导致它返回空白,例如i=175“水平分辨率”

于 2020-06-05T21:01:08.547 回答