Μήνυμα λάθους όταν η μέθοδος filesystemobject.copyfolder συναντήσει ένα αρχείο μόνο για ανάγνωση προορισμού: "Permission Denied"


Συμπτώματα


Προσπαθείτε να χρησιμοποιήσετε τον παρακάτω κώδικα για να αντιγράψετε τα περιεχόμενα ενός συγκεκριμένου φακέλου στο φάκελο προορισμού που περιέχει ένα αρχείο μόνο για ανάγνωση:
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 Script Host :
Δέσμες ενεργειών: C:\folderName\test.vbs

Γραμμή: 3

CHAR: 1

ΣΦΑΛΜΑ: Δεν έχετε δικαίωμα πρόσβασης

Κωδικός: 800A0046

Προέλευσης: Σφάλμα χρόνου εκτέλεσης Microsoft VBScript
Αυτή η συμπεριφορά είναι αναμενόμενη. Συνήθως, λαμβάνετε ένα μήνυμα λάθους "Permission Denied" όταν η μέθοδος filesystemobject.copyfolder συναντήσει ένα αρχείο προορισμού μόνο για ανάγνωση. Ωστόσο, μπορείτε να σύρετε ένα αρχείο σε ένα φάκελο που περιέχει ένα αρχείο μόνο για ανάγνωση με το ίδιο όνομα. Σε αυτήν την περίπτωση, λαμβάνετε το ακόλουθο μήνυμα στην Εξερεύνηση των Windows:
Αυτός ο φάκελος περιέχει ήδη ένα αρχείο μόνο για ανάγνωση με το όνομα '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 απενεργοποιεί το διακόπτη που έχει προκαθοριστεί στη μεταβλητή περιβάλλοντος COPYCMD .
  • Το βοηθητικό πρόγραμμα XCOPY δεν είναι διαθέσιμες στα Windows Vista. Για να επιλύσετε αυτό το ζήτημα στα Windows Vista, χρησιμοποιήστε το αρχείο Robocopy.exe αντί για το αρχείο Xcopy.exe στο παράδειγμα κώδικα.