VBA - 获取所有文件属性

时间:2018-05-09 21:49:31

标签: vba excel-vba excel

我想从文件夹中的所有文件中获取属性。我已经为固定数量的属性工作了,我唯一关心的是找到GetDetailsOf方法中使用的最后一个属性的索引,以便我可以列出所有属性。

下面的函数返回属性的数量,但是不正确,因为它基于最后的非空属性名称。但是有一些带有空名称的索引(不确定它们是否可以有值),后面是另一个具有普通字符串属性名称的索引。

我还尝试On Error Resume Next,错误表明最后一个索引已被使用,但是从来没有出现错误,导致无限循环,显然GetDetailsOf将接受每个长> = 0

我还想知道一台机器上每个文件夹的文件属性数是否相同。

编辑:我可能没有清楚地表达它,我想要的是获取最后一个属性名称的索引,以便我可以检查所有现有属性的值。

编辑2:这是我文件的链接,列出了所有文件夹和所有级别子文件夹中所有文件的属性。可能有一些没有处理的错误(我已经用快捷方式崩溃了一个宏),Windows路径长度限制出现在我的脑海中,但它通常适用于所选文件夹。

感兴趣的主要功能是list_properties模块中的CountProperties。它决定返回多少属性列。

https://drive.google.com/open?id=1TRIZJoGnHXs9LJtxDBj9rp27ngkects-

Function CountProperties(ByRef FldPath) As Long

Dim objShell As Object
Dim objFolder As Object
Dim testStr As String
Dim propertyCnt As Long

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(Left(FldPath, Len(FldPath) - 1)) 'no slash in the end

Do
    testStr = vbNullString      
    testStr = objFolder.GetDetailsOf(objFolder.Items, propertyCnt)      
    If testStr = vbNullString Then Exit Do
    propertyCnt = propertyCnt + 1
Loop

CountProperties = propertyCnt

End Function

2 个答案:

答案 0 :(得分:1)

我并不完全清楚这个目标是什么,但以下内容应该提取您需要的所有信息。

包括:按文件计算的总设置属性数,设置属性的文件夹数,每个文件的扩展属性值以及文件夹中的所有文件是否具有指定值的相同数量的属性。我可能会重新考虑这个功能,但等待你的反馈。

注意:

我选择了一个要返回的数组,因为我认为你最终可能会比较文件夹,这样你就可以使用文件夹路径作为键来创建返回数组的集合/字典。然后,您可以跨文件夹访问和比较阵列中的项目。

<强>代码:

{{1}}

示例运行:

Example run

<强>参考:

https://technet.microsoft.com/en-us/library/ee176615.aspx

答案 1 :(得分:0)

运行一些代码以了解有关通过GetDetailsOf获取的文件属性的更多信息,特别是检查C上数千个文件夹的属性名称,这是我发现的(Windows 7):

  • 所有这些文件夹的属性名称数量都是常量,所有这些文件夹的顺序都相同。
  • 非空字符串属性的最大索引为299(0到299)。在结尾附近有4个空字符串名称。 @Slai声称该号码因Windows版本而异,因为新版本会添加其他版本或更新。

我认为用GetDetailsOf检查一个文件夹让我们说从500到0,并且看到第一个非空名称的索引将是查找最后一个索引的方法。

但我建议只获取所需的属性,因为处理时间在很大程度上取决于文件类型,而对于包含1500个文件的大约50 GB目录,我可以在几秒钟内获得所有文件的300个属性值,一个文件更少的目录,但所有的MP3,花了几分钟。