Проверьте файл в папке назначения, если существует - PullRequest
0 голосов
/ 16 сентября 2010

Я пытаюсь определить количество файлов, которые будут скопированы из исходной папки в место назначения, а затем назначить это значение progressbar.max. Но используя приведенный ниже код, я получаю ошибку времени выполнения 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

Ответы [ 2 ]

2 голосов
/ 16 сентября 2010
If Len(Dir$(dDirName & sFileName)) > 0 Then

Вы задали итерацию вашего каталога с помощью строки:

sFileName = Dir(sDirName)

Вызов функции Dir без параметров приведет к получению следующего элемента, соответствующего шаблону имени файла и атрибутам. Лен (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 голос
/ 17 сентября 2010

Dir возвращает имя соответствующего файла, каталога или папки. Вызов Dir должен быть в порядке, но в вашем случае это приводит к ошибке.

У вас также не реализовано ни одного цикла для итерации всех доступных исходных файлов.

Использование FileSystemObject является одним из вариантов. Чтобы использовать FileSystemObject, выберите пункт меню Project , а затем пункт меню References ... . Откроется диалоговое окно References .

Установите флажок рядом со ссылкой " Microsoft Scripting Runtime " и нажмите OK .

Теперь вы можете объявить переменную как 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

Я протестировал приведенный выше код, и он правильно увеличивает количество файлов ToBeCopied до ожидаемого числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...