Issue with MoveFile method to overwrite file in Destination in vbscript?
Like mentioned before, MoveFile cannot overwrite existing File. But you can create your own Function:
Function MoveFile(source, target)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile source, target, True
fso.DeleteFile source
End Function
And then call it like:
MoveFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name
Examples above look good, but there is a risk that the source and destination paths may be the same. Then the file overrides itself, and nothing seems to be actually copied. So if you delete the source file after that, then the file can be lost! So what I use is the function below (which I believe is more safe):
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
Unfortunately, the VBScript MoveFile
method works only when the target file does not exist. It can't overwrite such file when exists, just throw error.
So the only option is to use CopyFile (which does have option to overwrite) then DeleteFile:
fso.CopyFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name, True
fso.DeleteFile ObjFile.Path