FileSystemObject MoveFile 似乎不一致并且在移动某些文件而不是其他文件时有效

问题描述

我在使用 MoveFile 尝试移动 ppt 文件代替 pptx 文件时遇到错误,但反过来不行。在此示例代码中,我将文件从 files_temp 文件夹移动到 files 文件夹(不包括文件夹创建代码)。

Set theForm = Server.CreateObject("ABCUpload4.XForm")
theForm.MaxUploadSize = 5242880
theForm.Overwrite = True
Set theField = theForm.Files("filefield")

f_name = Trim(UCase(theField.FileName))
f_type = Trim(UCase(theField.FileType))

'=================================================================
' Overwrite ppt/pptx file if exists else move from temp to save folder
'=================================================================
Dim file_type_array1 = Array("pptx","ppt")
Dim file_type_exists1 = false

temp_file_path = Trim(Request.ServerVariables("APPL_PHYSICAL_PATH")) & "files_temp\" & f_name & "." & f_type
save_file_path = Trim(Request.ServerVariables("APPL_PHYSICAL_PATH")) & "files\" & "new_file_name." & f_type

'save_file_path w/o extension (used to loop through all extensions)
save_file_path_ne = Trim(Request.ServerVariables("APPL_PHYSICAL_PATH")) & "files\" & "new_file_name."

Set fsobject = Server.CreateObject("Scripting.FileSystemObject")
For x = 0 To UBound(file_type_array1)
    If fsobject.FileExists(save_file_path_ne & file_type_array1(x)) then
        fsobject.DeleteFile(save_file_path_ne & file_type_array1(x))
        fsobject.MoveFile temp_file_path,save_file_path
        file_type_exists1 = true
    End If
Next
If file_type_exists1 = false Then
    fsobject.MoveFile temp_file_path,save_file_path
End If
set fsobject = nothing
file_type_exists1 = false

代码有效的情况:

  1. 第一次上传文件(pptx 或 ppt) - 从“files_temp”正确移动到“files”文件
  2. ppt 文件被 pptx 文件覆盖 - ppt 文件被正确删除,pptx 文件从“files_temp”移动到“files”文件

代码不起作用的情况:

  1. pptx 文件尝试被 ppt 文件覆盖 - pptx 文件被正确删除并从“files_temp”文件夹中取出一个文件,然后 MoveFile 函数出错:

Microsoft VBScript 运行时错误“800a0035” 找不到文件

我没有包含所有代码,但应该足以解决这个问题。如果您需要提供额外的代码,请告诉我。还为这个例子重写了我现有的代码,所以语法错误的可能性很小。

解决方法

我没有弄清楚我遇到这些问题的确切原因,但我有一个解决方法。我没有使用 MoveFile 移动并同时重命名临时文件,而是将其分解为两个步骤。我必须首先使用 CopyFile 将文件从 temp_file_path 复制到 save_file_path,然后更改 save_file_path 中的文件名。

修订代码:

'save_file_path but with original file name
save_file_path_o = Trim(Request.ServerVariables("APPL_PHYSICAL_PATH")) & "files\" & f_name & "." & f_type

Set fsobject = Server.CreateObject("Scripting.FileSystemObject")
For x = 0 To UBound(file_type_array1)
If fsobject.FileExists(save_file_path_ne & file_type_array1(x)) then
    fsobject.DeleteFile(save_file_path_ne & file_type_array1(x))
    fsobject.CopyFile temp_file_path,save_file_path_o
    Set objFile = fsobject.GetFile(save_file_path_o)
    objFile.Name = save_file_name
    file_type_exists1 = true
End If
Next
If file_type_exists1 = false Then
    fsobject.MoveFile temp_file_path,save_file_path
End If
set fsobject = nothing
set objFile = nothing
file_type_exists1 = false