上面的示例看起来不错,但存在源路径和目标路径可能相同的风险。然后文件会覆盖自身,实际上似乎没有复制任何内容。所以如果你在那之后删除源文件,那么文件可能会丢失!所以我使用的是下面的功能(我认为它更安全):
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
' t.kubiak@engineer.com
'
' 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