使用VBA参考Microsoft Scripting Runtime。我正在尝试比较两个不同目录中的文件名,以查找两个目录中是否存在相同的文件。但是,我不是在寻找完全匹配的东西;我想删除某些类型的前缀,因此,例如,A-12234.pdf
,12234.pdf
和A_ 12234.pdf
应该被视为彼此相等。
假设我有一个函数stripPrefix()
执行必要的字符串操作,将文件名更改为可与其他文件进行比较的版本 - 在先前的情况下,stripPrefix()
将返回{{1}然后我可以使用以下代码比较目录12234.pdf
和c:\dir1
中的文件名:
c:\dir2
这里的大问题:每次迭代sub findMatchFilenames()
dim fso as fileSystemObject
dim dir1 as folder
dim dir2 as folder
dim file1 as file
dim file2 as file
set fso=new fileSystemObject
set dir1=fso.getfolder("c:\dir1")
set dir2=fso.getfolder("c:\dir2")
for each file1 in dir1.files
for each file2 in dir2.files
if stripPrefix(file1.name)=stripPrefix(file2.name) then
debug.print file1.name & " matches " & file2.name
end if
next file2
next file1
end sub
循环时,我都会在stripPrefix()
中为dir2
调用相同的文件名。我可以构建每个文件名的剥离版本的数组for..next file1
和dir1Array
,但似乎我无法将它们与dir2Array
和Files
中的dir1
个集合相关联因为dir2
集合没有数字索引。我知道,因为我尝试使用:
Files
并从Set fso = New FileSystemObject
Set folderObj = fso.GetFolder("c:\data")
fileCount = folderObj.Files.Count
For c = 1 To fileCount
MsgBox c & " " & folderObj.Files(c).name
Next
获得了“无效的过程调用或参数”。我想我可以在folderObj.Files(c).name
循环中增加一个计数器并使用计数器返回数组,如:
for..next
但这看起来很笨重。有没有更好的方法来处理这个文件名比较操作?
答案 0 :(得分:1)
为什么不创建目录2的字典对象,然后使用目录1搜索它。您可以在插入字典对象时去除前缀。
唯一的问题是,您可能没有在字典中使用唯一的文件名
例如,在剥离前缀
后,A-12345与A12345相同答案 1 :(得分:1)
为什么不使用DIR使用通配符?
像(未经测试)的东西:
myFile = Dir("C:\*1234.pdf")
Do While myFile <> ""
If myFile <> "." And MyFile <> ".." Then
Msgbox myFile
End If
MyFile = Dir
Loop
将其放入数组中。您也可以对其他目录执行相同的操作,然后比较两个数组。