我正在尝试确定从源文件夹复制到目标文件的文件数,然后使用下面的代码将此值分配给progressbar.max.But我得到运行时错误5,无效的过程调用或参数在标记的位置。请指导
Private Sub cmdCopy_Click()
Dim sFileName As String 'Source File
Dim sDirName As String 'Source Directory
Dim dDirName As String 'Destination Directory
Dim fiFileCount As Integer 'Number of Files to be copied
Dim fbFileMatch As Boolean
If prgFCount.Visible = True Then prgFCount.Visible = False
dDirName = "D:\Destination\"
sDirName = "C:\Source\"
sFileName = Dir(sDirName)
' Disable this button so the user cannot
' start another copy.
cmdCopy.Enabled = False
cmdCancel.Enabled = True
fiFileCount = 0
Do While Len(sFileName) > 0
fbFileMatch = False
If Len(Dir$(dDirName & sFileName)) > 0 Then
fbFileMatch = True
End If
If fbFileMatch = False Then
fiFileCount = fiFileCount + 1
End If
sFileName = Dir '## Error at this Point ##
Loop
If fiFileCount = 0 Then
cmdCopy.Enabled = True
cmdCancel.Enabled = False
Exit Sub
End If
prgFCount.Min = 0
prgFCount.Max = fiFileCount
prgFCount.Visible = True
End Sub
答案 0 :(得分:2)
If Len(Dir$(dDirName & sFileName)) > 0 Then
使用以下行设置目录迭代:
sFileName = Dir(sDirName)
调用不带参数的 Dir 功能将获得符合文件名模式的下一项,并检索属性。 Len(Dir $电话搞砸了。
我建议重写代码以遍历源文件夹中的所有文件并构建列表,然后遍历列表并在目标文件夹中查找匹配项。
这样的事情:
...
sFileName = Dir$(sDirName)
Do While Len(sFileName) > 0
i = i + 1
ReDim Preserve strSourceFileList(i)
strSourceFileList(i) = sFileName
sFileName = Dir()
Loop
If i > 0 Then
For i = LBound(strSourceFileList) To UBound(strSourceFileList)
sFileName = Dir$(dDirName & strSourceFileList(i))
If Len(sFileName) = 0 Then
fiFileCount = fiFileCount + 1
End If
Next i
End If
...
答案 1 :(得分:1)
Dir
返回匹配文件,目录或文件夹的名称。
调用Dir
应该没问题,但在你的情况下会产生错误。
您还没有实现循环以通过所有可用的源文件进行迭代。
使用FileSystemObject
是其中一个选项。
要使用FileSystemObject
,请点击项目菜单选项,然后点击参考文献... 菜单选项。
这将打开引用对话框。
勾选名为“ Microsoft Scripting Runtime ”的参考旁边的框,然后点击确定。
现在您可以将变量声明为FileSystemObject
。此外,您还可以访问更多对象,例如File
,Folder
,Files
等。
使用FileSystemObject
可以访问各种功能。
下面的代码演示了如何使用FileSystemObject
获取目的地中不存在且将被复制的文件数。
Private Sub cmdCopy_Click()
Dim fso As New FileSystemObject
Dim sourceFolder As Folder
Dim sourceFile As File
Dim destinationFolder As Folder
Dim filesToBeCopied As Integer
Set sourceFolder = fso.GetFolder("C:\-- Temp --\Source")
Set destinationFolder = fso.GetFolder("C:\-- Temp --\Destination")
filesToBeCopied = 0
' Iterrate through each file in the source folder.
For Each sourceFile In sourceFolder.Files
' Check if the source file exists in the destination folder
If Not (fso.FileExists(destinationFolder + "\" + sourceFile.Name)) Then
filesToBeCopied = filesToBeCopied + 1
End If
Next
End Sub
我已经测试了上面的代码,它正确地将filesToBeCopied的数量增加到预期的数量。