在 filesystemobject.copyfolder 方法遇到只读目标文件时出现错误消息:"权限被拒绝"


症状


您尝试使用下面的代码以将特定文件夹的内容复制到目标文件夹,其中包含一个只读的文件︰
Dim fso, result, source, destination source= "C:\source_folder" 
destination = "D:\destination_folder"
Set fso = CreateObject("Scripting.FileSystemObject")
result = fso.CopyFolder(source, destination, true)

注意:在此代码中, source_folder表示实际源文件夹的名称,和destination_folder表示实际目标文件夹的名称。
运行此代码时,您在Windows 脚本宿主对话框中收到以下错误消息︰
脚本︰ C:\folderName\test.vbs

行︰ 3

字符︰ 1

错误︰ 权限被拒绝

代码︰ 800A0046

来源︰ Microsoft VBScript 运行时错误
此行为被预期行为。通常情况下, filesystemobject.copyfolder方法遇到只读目标文件时收到"拒绝访问"错误消息。但是,您可以将文件拖动到包含具有相同名称的只读文件的文件夹。在这种情况下,Windows 资源管理器中收到以下消息︰
此文件夹已包含一个名为 test.txt 的只读文件

要替换现有的文件︰

target_file_information
用这个吗?

source_file_information

原因


CopyFolder方法的限制出现此问题。CopyFolder方法无法覆盖目标文件夹中的文件,如果文件具有只读属性集。CopyFile方法有此相同的限制。

解决方案


要解决此问题,请使用/R开关和 XCOPY 实用程序覆盖只读文件。下面的代码示例演示使用 XCOPY 实用程序来执行此操作的一种方法。

Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于适销性或特定用途适用性的暗示担保。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能。但是,他们不会修改这些示例以提供额外的功能或构建过程以满足您的特定要求。
Dim oShell, source, destination source = "C:\myFolder\*" 
destination = "D:\myOtherFolder"
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "xcopy.exe " & source & " " & destination & " /R /Y"
Set oShell = Nothing

在此代码示例, /R开关使覆盖只读文件。/Y开关禁止提示您确认要覆盖现有的目标文件。

备注:
  • /Y开关可能预设在COPYCMD环境变量中。如果您想要显示的提示,您可以使用/Y开关/ Y版本。开关/ Y版本时将预设在COPYCMD环境变量/Y开关关闭。
  • XCOPY 实用程序不在 Windows Vista 中可用。若要解决此问题,在 Windows Vista 中,而不是在代码示例中的 Xcopy.exe 文件中使用的 Robocopy.exe 文件。