سؤال

shutil.rmtree لن يحذف الملفات للقراءة فقط على Windows. هل هناك ثعبون يعادل "RM -RF"؟ لماذا يا لماذا هذا مثل هذا الألم؟

هل كانت مفيدة؟

المحلول

shutil.rmtree يمكن أن تتخذ وظيفة معالجة الأخطاء التي سيتم استدعاؤها عندما يكون لديها مشكلة في إزالة ملف. يمكنك استخدام ذلك لإجبار إزالة الملف (ملفات) إشكالية.

مستوحاة من http://mail.python.org/pipmail/tutor/2006-june/047551.html. و http://techarttiki.blogspot.com/2008/08/Read-Only-Windows-Files-With-python.html.:

import os
import stat
import shutil

def remove_readonly(func, path, excinfo):
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(top, onerror=remove_readonly)

(لم أختبر أن المقتطف خارج، ولكن يجب أن يكون كافيا لإبداعك)

نصائح أخرى

إذا قمت باستيراد Win32api من Pywin32، يمكنك استخدام:

win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

لجعل الملفات تتوقف عن القراءة فقط.

طريقة أخرى هي تحديد RMTREE على Windows كما

rmtree = lambda path: subprocess.check_call(['cmd', '/c', 'rd', '/s', '/q', path])

هناك تعليق في Activestate. الموقع الذي يقول:

Shutil.Rmtree له أوجه القصور. على الرغم من أنه صحيح، يمكنك استخدام Shutil.RMTREE () في كثير من الحالات، فهناك بعض الحالات التي لا تعمل فيها. على سبيل المثال، لا يمكن حذف الملفات التي يتم وضع علامة عليها للقراءة فقط ضمن Windows بواسطة shutil.rmtree ().

عن طريق استيراد وحدات Win32api و Win32con من Pywin32 وإضافة خط مثل "Win32api.SetFileatibutes (المسار، Win32Con.File_Attribute_Normal" إلى وظيفة RMGeneric ()، يمكن التغلب عليها هذه العقبة. لقد استخدمت هذا النهج لإصلاح البرنامج النصي Hot-backup.py من التخريب 1.4 لذلك سيعمل تحت ويندوز. شكرا لك على الوصفة.

لا أستخدم Windows، لذلك لا يمكن التحقق مما إذا كان هذا يعمل أم لا.

هنا هو مختلف ما نشره ستيف، ويستخدم نفس الآلية الأساسية، وهذا واحد هو اختبار :-)

ما المستخدم من البرامج النصية بيثون تعمل كما في ويندوز؟

من المفترض أن تكون ثابتة مع إطلاق سراح بيثون 3.5. (حاليا - يونيو 2015 - لا يزال قيد التطوير) بمعنى إعطاء تلميح حول هذا الوثائق.

يمكنك أن تجد bugreport هنا. وبعد و هذه هو وفقا لتشغيل.

انظر المثال المضافة حديثا من بيثون 3.5 مستندات:

import os, stat
import shutil

def remove_readonly(func, path, _):
    "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)

shutil.rmtree(directory, onerror=remove_readonly)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top