【问题标题】:Using VBA to get extended file attributes使用VBA获取扩展文件属性
【发布时间】:2011-04-13 15:39:15
【问题描述】:

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

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

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

  • 作者
  • 关键字
  • 评论
  • 最后一位作者
  • 类别
  • 主题

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

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

【问题讨论】:

    标签: vba file-attributes fso


    【解决方案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
    

    【讨论】:

    【解决方案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

    【讨论】:

    • 我的问题不是很清楚。我正在尝试从磁盘上的文件中捕获文件属性。这看起来像是从打开的文档中读取属性。如何从磁盘上的文件中获取属性?
    • 啊,它被标记为 Excel-VBA,所以我认为您想从客户端内部执行此操作。对于客户端外部(即从磁盘读取),您将使用 DSOFile.dll (我回答的最后一段)。
    • 更改了标签,因为这与 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 & 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】:

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

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

      https://docs.microsoft.com/en-us/windows/win32/shell/folder-getdetailsof

      我的计算机上的属性代码不同,就像上面提到的人一样,即使不是,大多数返回空白值。我使用 for 循环遍历所有这些,发现 Title 和 Subject 仍然可以访问,这对于我的目的来说已经足够了。

      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
      

      【讨论】:

      • 还有其他答案提供了 OP 的问题,它们是前段时间发布的。发布答案时,请确保添加新的解决方案或更好的解释,尤其是在回答较旧的问题时。
      • 好吧,我以为我很清楚。旧的投票代码无法在 Windows 10 系统上运行(至少不是我的)。上面提到的引用的 MS 库链接提供了有关如何使其工作的当前示例。我的示例将它们与后期绑定一起使用。
      • 请检查我的编辑 - 所以,我们应该删除我们的 cmets 进行清理。
      【解决方案5】:

      幸运的发现

      如果objFolderItem 在你调用时是空的

      objFolder.GetDetailsOf(objFolderItem, i)
      

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

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

      【讨论】:

      • 请详细说明
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多