ข้อความแสดงข้อผิดพลาดเมื่อวิธีการ 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

Char: 1

ข้อผิดพลาด: ปฏิเสธการอนุญาต

รหัส: 800A0046

แหล่งที่มา: ข้อผิดพลาดรันไทม์ Microsoft VBScript
ลักษณะการทำงานนี้ที่คาดไว้ โดยทั่วไปแล้ว คุณได้รับข้อความแสดงข้อผิดพลาด "ปฏิเสธสิทธิ์" เมื่อวิธีการfilesystemobject.copyfolderพบแฟ้มปลายทางแบบอ่านอย่างเดียว อย่างไรก็ตาม คุณสามารถลากแฟ้มไปยังโฟลเดอร์ที่ประกอบด้วยแฟ้มแบบอ่านอย่างเดียวมีชื่อเดียวกัน ในกรณีนี้ คุณได้รับข้อความต่อไปนี้ใน Windows Explorer:
โฟลเดอร์นี้ประกอบด้วยแฟ้มแบบอ่านอย่างเดียวชื่อ 'test.txt'

คุณต้องการแทนแฟ้มที่มีอยู่:

target_file_information
ด้วยนี้หรือไม่

source_file_information

สาเหตุ


ปัญหานี้เกิดขึ้นเนื่องจาก มีข้อจำกัดในวิธีการCopyFolder วิธีการCopyFolderไม่สามารถเขียนทับแฟ้มในโฟลเดอร์ปลายทางถ้าแฟ้มมีการแบบอ่านอย่างเดียวแอททริบิวต์ของชุดงาน วิธีการCopyFileมีข้อจำกัดเดียวกันนี้

การแก้ปัญหา


เมื่อต้องการแก้ไขปัญหานี้ ใช้ยูทิลิตี XCOPY ร่วมกับสวิตช์/Rเพื่อเขียนทับแฟ้มแบบอ่านอย่างเดียว ตัวอย่างรหัสต่อไปนี้แสดงวิธีหนึ่งในการใช้ 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ของสวิตช์ปิดสวิตช์/Yที่กำหนดไว้ล่วงหน้าในตัวแปรของสภาพแวดล้อมของCOPYCMD
  • โปรแกรมอรรถประโยชน์นี้ XCOPY จะไม่พร้อมใช้งานใน Windows Vista เมื่อต้องการแก้ไขปัญหานี้ใน Windows Vista ใช้แฟ้ม Robocopy.exe แทนที่เป็นแฟ้ม Xcopy.exe ในตัวอย่างรหัส