Запишите в использование файла CopyHere, не используя WScript. Сон

Я записал, что маленький VBScript к создает .zip файл и затем копирует содержание указанной папки в это .zip файл.

Я копирую файлы один за другим по причине (я знаю, что могу сделать всех сразу). Однако моя проблема состоит в том, когда я пытаюсь скопировать их один за другим без WScript. Сон между каждым повторением цикла я получаю "Файл, не найденный или никакое разрешение чтения". ошибка; если я помещаю a WScript.Sleep 200 после каждой записи это работает, но не 100% времени.

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

Как Вы видите с маленькой частью кода ниже, я циклично выполняюсь через файлы, затем если они соответствуют расширению, я размещаю их в .zip (zipFile)

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        if (InStr(file, extension)) Then
            zipFile.CopyHere(file)
            WScript.Sleep 200
            Exit For
        End If
    Next
Next

Какие-либо предложения о том, как я могу прекратить полагаться на функцию Сна?

Спасибо

5
задан mlevit 22 May 2010 в 17:05
поделиться

2 ответа

Вы можете попытаться получить доступ к только что скопированному файлу, например, с помощью проверки «существует»:

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
            zipFile.CopyHere(file)
            Dim i: i = 0
            Dim target: target = oFSO.BuildPath(zipFile, oFSO.GetFileName(file))
            While i < 100 And Not oFSO.FileExists(target) 
              i = i + 1
              WScript.Sleep 10
            Wend
            Exit For
        End If
    Next
Next

Я не уверен, правильно ли цель вычислена для этого контекста использования, но вы получить идею. Я немного удивлен, что эта ошибка возникает в первую очередь ... FileSystemObject должен быть строго синхронным.

Если ничего не помогает, сделайте следующее:

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
            CompressFailsafe zipFile, file
            Exit For
        End If
    Next
Next

Sub CompressFailsafe(zipFile, file)
  Dim i: i = 0
  Const MAX = 100

  On Error Resume Next
  While i < MAX
    zipFile.CopyHere(file)
    If Err.Number = 0 Then 
      i = MAX
    ElseIf Err.Number = xxx ''# use the actual error number!
      Err.Clear
      WScript.Sleep 100
      i = i + 1
    Else 
      ''# react to unexpected error
    End Of
  Wend
  On Error GoTo 0
End Sub
0
ответ дан 15 December 2019 в 00:52
поделиться

Вы правы, CopyHere асинхронный. Когда я делаю это в vbscript, я сплю до тех пор, пока количество файлов в zip-архиве не станет больше или равно количеству скопированных файлов.

Sub NewZip(pathToZipFile)

   WScript.Echo "Newing up a zip file (" & pathToZipFile & ") "

   Dim fso
   Set fso = CreateObject("Scripting.FileSystemObject")
   Dim file
   Set file = fso.CreateTextFile(pathToZipFile)

   file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)

   file.Close
   Set fso = Nothing
   Set file = Nothing

   WScript.Sleep 500

End Sub



Sub CreateZip(pathToZipFile, dirToZip)

   WScript.Echo "Creating zip  (" & pathToZipFile & ") from (" & dirToZip & ")"

   Dim fso
   Set fso= Wscript.CreateObject("Scripting.FileSystemObject")

   If fso.FileExists(pathToZipFile) Then
       WScript.Echo "That zip file already exists - deleting it."
       fso.DeleteFile pathToZipFile
   End If

   If Not fso.FolderExists(dirToZip) Then
       WScript.Echo "The directory to zip does not exist."
       Exit Sub
   End If

   NewZip pathToZipFile

   dim sa
   set sa = CreateObject("Shell.Application")

   Dim zip
   Set zip = sa.NameSpace(pathToZipFile)

   WScript.Echo "opening dir  (" & dirToZip & ")"

   Dim d
   Set d = sa.NameSpace(dirToZip)

   ' for diagnostic purposes only
   For Each s In d.items
       WScript.Echo  s
   Next


   ' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
   ' ===============================================================
   ' 4 = do not display a progress box
   ' 16 = Respond with "Yes to All" for any dialog box that is displayed.
   ' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified. 
   ' 256 = Display a progress dialog box but do not show the file names.
   ' 2048 = Version 4.71. Do not copy the security attributes of the file.
   ' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.

   WScript.Echo "copying files..."

   zip.CopyHere d.items, 4

   Do Until d.Items.Count <= zip.Items.Count
       Wscript.Sleep(200)
   Loop

End Sub
1
ответ дан 15 December 2019 в 00:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: