1

参考 Microsoft Scripting Runtime 使用 VBA。我正在尝试比较两个不同目录中的文件名,以查找两个目录中是否存在同一个文件。但是,我不是在寻找完全匹配的;我想去掉某些类型的前缀,例如 , A-12234.pdf, 12234.pdfandA_ 12234.pdf应该被认为是彼此相等的。

假设我有一个函数stripPrefix()可以执行必要的字符串操作,将文件名更改为可以与其他文件名进行比较的版本——在前一种情况下,stripPrefix()将返回12234.pdf所有 3 个。然后我可以比较目录中的文件名c:\dir1c:\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()相同的文件名。我可以构建数组和每个文件名的剥离版本,但似乎我无法将它们与集合相关联,因为集合没有数字索引。我知道是因为我尝试使用:dir2for..next file1dir1Arraydir2ArrayFilesdir1dir2Files

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循环中增加一个计数器并使用计数器来引用数组,例如:

'after creating arrays of stripPrefix() for dir1 and dir2
ctr1=0
for each file1 in dir1.files
 ctr2=0
 for each file2 in dir2.files
  if dir1array(ctr1)=dir2array(ctr2) then
   debug.print file1.name & " matches " & file2.name
  end if
  ctr2=ctr2+1
 next file2
 ctr1=ctr1+1
next file1

但这似乎很笨拙。有没有更好的方法来处理这个文件名比较操作?

4

2 回答 2

1

为什么不创建目录 2 的字典对象,然后使用目录 1 进行搜索。您可以在插入字典对象时去掉前缀。

唯一的问题是,您可能在字典中没有唯一的文件名

例如 A-12345 在去除前缀后与 A12345 相同

于 2011-11-16T03:08:15.637 回答
1

为什么不通过使用 DIR 来使用通配符?

类似的东西(未测试):

myFile = Dir("C:\*1234.pdf")
Do While myFile <> ""
If myFile <> "." And MyFile <> ".." Then
Msgbox myFile
End If
MyFile = Dir 
Loop

把它放到一个数组中。您也可以对另一个目录执行相同的操作,然后比较两个数组。

于 2011-11-16T16:21:34.507 回答