遍历文件夹并找到特定文件
Iterate through the folder and find a particular file
我编写了这段代码来遍历文件夹并在找到“.c”文件时退出函数。理想情况下,它应该 return “.c”文件的路径。但它是 returning 空字符串。
tval = 1
Function findStlcode(objFSO,fFolder,folderName)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Folder = objFSO.GetFolder(fFolder)
Set colfiles = Folder.Files
For Each objFile In colfiles
strFilename = objFile.name
If strcomp(strFilename,folderName & ".c",vbTextCompare) = 0 Then
findStlcode = fFolder & "\" & folderName & ".c"
tval = tval + 1
Exit Function
End If
Next
For Each Subfolder In Folder.SubFolders
If tval = 1 Then
xx = findStlcode(objFSO, Subfolder.Path, folderName)
End If
Next
End Function
将 FOR 循环内容更改为以下内容,将 xx 更改为 findStlcode,它应该可以工作
strFilename = objFile.name
If Right(strFilename, 2) = ".c" Then
findStlcode = fFolder & "\" & strFilename
tval = tval + 1
Exit Function
End If
下面是完整的代码
tval = 1
Function findStlcode(objFSO,fFolder)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Folder = objFSO.GetFolder(fFolder)
Set colfiles = Folder.Files
For Each objFile In colfiles
strFilename = objFile.name
If Right(strFilename, 2) = ".c" Then
findStlcode = fFolder & "\" & strFilename
tval = tval + 1
Exit Function
End If
Next
For Each Subfolder In Folder.SubFolders
If tval = 1 Then
findStlcode = findStlcode(objFSO, Subfolder.Path)
End If
Next
End Function
调用函数
Set objFSO = CreateObject("Scripting.FileSystemObject")
Wscript.Echo findStlcode(objFSO, "C:\")
您的问题的根本原因是您的函数实际上 return 路径(通过将其分配给函数名称),正如其他人已经指出的那样。
但是,您可能还想解决一些与您的实施有关的其他问题:
- 您不应使用全局变量来跟踪是否找到匹配文件。递归函数调用的 return 值可用于相同的效果。
- 如果您无论如何都要在每次函数调用时重新创建它,那么传递
objFSO
是没有意义的。在几乎所有情况下,最好创建一个 FileSystemObject
实例作为全局(单例)对象并在脚本中的任何地方使用它。
- 传递文件夹对象而不是路径字符串,因此您不必在下一个递归步骤中将字符串转回文件夹对象。
- 如果您要检查扩展名,请使用适当的方法从文件名中提取扩展名 (
GetExtensionName
)。
像这样就足够了:
Set fso = CreateObject("Scripting.FileSystemObject")
Function findStlcode(fldr)
Dim f, sf, path
For Each f In fldr.Files
If LCase(fso.GetExtensionName(f)) = "c" Then
path = f.Path
Exit For
End If
Next
For Each sf In fldr.SubFolders
If IsEmpty(path) Then path = findStlcode(sf)
Next
findStlcode = path
End Function
startFolder = "C:\some\folder"
cfile = findStlCode(fso.GetFolder(startFolder))
我编写了这段代码来遍历文件夹并在找到“.c”文件时退出函数。理想情况下,它应该 return “.c”文件的路径。但它是 returning 空字符串。
tval = 1
Function findStlcode(objFSO,fFolder,folderName)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Folder = objFSO.GetFolder(fFolder)
Set colfiles = Folder.Files
For Each objFile In colfiles
strFilename = objFile.name
If strcomp(strFilename,folderName & ".c",vbTextCompare) = 0 Then
findStlcode = fFolder & "\" & folderName & ".c"
tval = tval + 1
Exit Function
End If
Next
For Each Subfolder In Folder.SubFolders
If tval = 1 Then
xx = findStlcode(objFSO, Subfolder.Path, folderName)
End If
Next
End Function
将 FOR 循环内容更改为以下内容,将 xx 更改为 findStlcode,它应该可以工作
strFilename = objFile.name
If Right(strFilename, 2) = ".c" Then
findStlcode = fFolder & "\" & strFilename
tval = tval + 1
Exit Function
End If
下面是完整的代码
tval = 1
Function findStlcode(objFSO,fFolder)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set Folder = objFSO.GetFolder(fFolder)
Set colfiles = Folder.Files
For Each objFile In colfiles
strFilename = objFile.name
If Right(strFilename, 2) = ".c" Then
findStlcode = fFolder & "\" & strFilename
tval = tval + 1
Exit Function
End If
Next
For Each Subfolder In Folder.SubFolders
If tval = 1 Then
findStlcode = findStlcode(objFSO, Subfolder.Path)
End If
Next
End Function
调用函数
Set objFSO = CreateObject("Scripting.FileSystemObject")
Wscript.Echo findStlcode(objFSO, "C:\")
您的问题的根本原因是您的函数实际上 return 路径(通过将其分配给函数名称),正如其他人已经指出的那样。
但是,您可能还想解决一些与您的实施有关的其他问题:
- 您不应使用全局变量来跟踪是否找到匹配文件。递归函数调用的 return 值可用于相同的效果。
- 如果您无论如何都要在每次函数调用时重新创建它,那么传递
objFSO
是没有意义的。在几乎所有情况下,最好创建一个FileSystemObject
实例作为全局(单例)对象并在脚本中的任何地方使用它。 - 传递文件夹对象而不是路径字符串,因此您不必在下一个递归步骤中将字符串转回文件夹对象。
- 如果您要检查扩展名,请使用适当的方法从文件名中提取扩展名 (
GetExtensionName
)。
像这样就足够了:
Set fso = CreateObject("Scripting.FileSystemObject")
Function findStlcode(fldr)
Dim f, sf, path
For Each f In fldr.Files
If LCase(fso.GetExtensionName(f)) = "c" Then
path = f.Path
Exit For
End If
Next
For Each sf In fldr.SubFolders
If IsEmpty(path) Then path = findStlcode(sf)
Next
findStlcode = path
End Function
startFolder = "C:\some\folder"
cfile = findStlCode(fso.GetFolder(startFolder))