Проблема с методом MoveFile для перезаписи файла в пункте назначения в vbscript?

У меня есть vbscript, который я написал для перемещения файлов из исходного каталога в целевой каталог. На данный момент сценарий работает так, что у меня есть файл сопоставления, который читается (сопоставляет идентификаторы с типом папки). Каждый перемещаемый файл начинается с идентификатора, и место назначения будет зависеть от того, с чем сопоставлен идентификатор. Я читаю файл сопоставления и создаю путь назначения для каждого перемещаемого файла. Все это работает, как и ожидалось, проблема в том, что когда я пытаюсь переместить файл, который уже существует в целевом каталоге, файлы не перемещаются из исходного каталога. По сути, я хотел бы перезаписать файл в целевом каталоге, если он уже существует. На данный момент моя основная команда такова:

fso.MoveFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name

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


person user1587060    schedule 12.06.2013    source источник


Ответы (3)


К сожалению, метод VBScript MoveFile работает только тогда, когда целевой файл не существует. Он не может перезаписать такой файл, если он существует, просто выдает ошибку.

Таким образом, единственный вариант - использовать CopyFile (у которого есть возможность перезаписать), а затем DeleteFile:

fso.CopyFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name, True
fso.DeleteFile ObjFile.Path
person Shadow Wizard Wearing Mask V2    schedule 12.06.2013
comment
Это здорово - спасибо за информацию. Я знал, что могу это сделать, просто не знал, есть ли более эффективный способ сделать это с помощью команды «Переместить». - person user1587060; 12.06.2013
comment
@ user1587060 нет, этот конкретный метод никогда не предназначался для такого использования. :) - person Shadow Wizard Wearing Mask V2; 12.06.2013
comment
Кажется странным, что метод копирования будет иметь возможность перезаписывать, а перемещение - нет. В любом случае, по крайней мере, теперь я знаю - person user1587060; 12.06.2013
comment
@user1587060 user1587060 я предполагаю, что MoveFile был создан для переименования файлов; цель переименования не должна существовать. И они никогда не удосужились изменить эту логику. :/ - person Shadow Wizard Wearing Mask V2; 12.06.2013

Как упоминалось ранее, MoveFile не может перезаписать существующий файл. Но вы можете создать свою собственную функцию:

Function MoveFile(source, target)
  Dim fso
  Set fso = CreateObject("Scripting.FileSystemObject")

  fso.CopyFile source, target, True
  fso.DeleteFile source
End Function

А затем назовите это так:

MoveFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name
person Stefan    schedule 01.10.2018

Приведенные выше примеры выглядят хорошо, но существует риск того, что исходный и конечный пути могут совпадать. Затем файл переопределяет себя, и кажется, что на самом деле ничего не копируется. Так что если после этого удалить исходный файл, то файл может быть потерян! Итак, я использую функцию ниже (которую я считаю более безопасной):

Public Function GrMoveFile(ByVal sMoveFrom As String, ByVal sMoveTo As String, Optional ByVal fOverride As Boolean = False) As Variant

' This function allows moving file between different drives or servers with possible overriding
' author: Tomasz Kubiak
' [email protected]
'
' RETURNS:
'   - true (if moving successfull)
'   - error description (otherwise)
' ARGUMENTS:
'   - sMoveFrom - source file path
'   - sMoveTo - destination file path
'   - fOverride - allow for overriding (false by default)

    Dim FSO As New Scripting.FileSystemObject   ' File system object - requires reference to Microsoft Scripting Library (Tools -> References)
    Dim OrigFileAttr As VbFileAttribute         ' Holds attribute of the destination file

On Error GoTo EH

    ' if overriding is allowed:
    If fOverride Then

        ' It's necessary to prevent the destination file from deleting,
        ' in case of the source path and destination path points to the same file
        ' (it's possible e.g. when the network location is mapped as a drive).
        ' So the solution is to lock the file by setting fileattribute to ReadOnly

        ' Before locking file let's remember the original state of the destination file
        OrigFileAttr = GetAttr(sMoveFrom)

        ' Unlock file before copy
        SetAttr sMoveFrom, vbNormal

        ' Original FSO MoveFile method does not allow overriding, so we copy the file at first
        FSO.CopyFile source:=sMoveFrom, destination:=sMoveTo, overwritefiles:=True

        ' Set destination file attribute to read-only to prevent deletion
        SetAttr sMoveTo, vbReadOnly

On Error Resume Next
        ' Theoretically the condition below should not be required, because FSO.delete method with
        ' attribut "force" set to false shouldn't allow for deleting "Read-only files".
        ' But in practice, when you have a file located on the server location, it appeared to not
        ' work properly and delete also RO-files, so i've introduced that condition
        If GetAttr(sMoveFrom) <> vbReadOnly Then
            ' Try to delete source file
            FSO.DeleteFile sMoveFrom, False
        End If

        'restore previous file attribute
        SetAttr sMoveTo, OrigFileAttr
On Error GoTo EH

    ' if overriding is NOT allowed:
    Else
        'move using regular move method (does not allow override)
        FSO.MoveFile source:=sMoveFrom, destination:=sMoveTo
    End If

    'pReleaseFolder

    ' Moving succesfull, let function return true
    GrMoveFile = True
    Exit Function

'Error handler
EH:
    'pReleaseFolder

    ' An error occured, return error description
    GrMoveFile = Err.Description
End Function

person Tomek Kubiak    schedule 25.10.2019