Mensaje de error cuando el método filesystemobject.copyfolder encuentra un archivo de destino de sólo lectura: "Permiso denegado"


Síntomas


Intenta utilizar el código siguiente para copiar el contenido de una carpeta a una carpeta de destino que contiene un archivo de sólo lectura:
Dim fso, result, source, destination source= "C:\source_folder" 
destination = "D:\destination_folder"
Set fso = CreateObject("Scripting.FileSystemObject")
result = fso.CopyFolder(source, destination, true)

Nota: En este código, source_folder representa el nombre de la carpeta de origen real y destination_folder representa el nombre de la carpeta de destino real.
Cuando se ejecuta este código, recibirá el siguiente mensaje de error en el cuadro de diálogo Windows Script Host :
Secuencia de comandos: C:\folderName\test.vbs

Línea: 3

Char: 1

Error: Permiso denegado

Código: 800A0046

Fuente: Error de tiempo de ejecución de Microsoft VBScript
Este es el comportamiento esperado. Normalmente, recibirá un mensaje de error "Permiso denegado" cuando el método filesystemobject.copyfolder encuentra un archivo de destino de sólo lectura. Sin embargo, puede arrastrar un archivo a una carpeta que contiene un archivo de sólo lectura del mismo nombre. En este caso, recibirá el mensaje siguiente en el Explorador de Windows:
Esta carpeta ya contiene un archivo de sólo lectura denominado 'test.txt'

¿Desea reemplazar el archivo existente:

target_file_information
¿con esta otra?

source_file_information

Causa


Este problema se produce debido a una limitación en el método CopyFolder . El método CopyFolder no puede sobrescribir un archivo en la carpeta de destino si el archivo tiene el modo de sólo lectura atributo establecido. El método CopyFile tiene esta misma limitación.

Solución


Para resolver este problema, utilice la utilidad XCOPY junto con el modificador/r para sobrescribir los archivos de sólo lectura. En el ejemplo de código siguiente se muestra una forma de emplear la utilidad XCOPY para ello.

Microsoft proporciona ejemplos de programación únicamente con fines ilustrativos, sin ninguna garantía expresa o implícita. Esto incluye, pero no se limita, a las garantías implícitas de comerciabilidad o idoneidad para un propósito particular. Este artículo asume que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se utilizan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden explicarle la funcionalidad de un determinado procedimiento. Sin embargo, no modificarán estos ejemplos para ofrecer mayor funcionalidad ni crearán procedimientos que cumplan sus requisitos específicos.
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

En este ejemplo, el modificador /R permite sobrescribir los archivos de sólo lectura. El modificador /Y suprime el mensaje para confirmar que desea sobrescribir el archivo de destino existente.

Notas:
  • El modificador /Y puede preestablecerse en la variable de entorno COPYCMD . Si desea que aparezca la petición, puede utilizar la versión /-Y del modificador /Y . La versión /-Y del modificador desactiva el modificador /Y preestablecido en la variable de entorno COPYCMD .
  • La utilidad XCOPY no está disponible en Windows Vista. Para resolver este problema en Windows Vista, utilice el archivo Robocopy.exe en lugar del archivo Xcopy.exe en el ejemplo de código.