OVH Cloud OVH Cloud

Effacement de repertoires contenant des fichiers read-only

5 réponses
Avatar
Fouff
Bien le bonjour à toutes et à tous.

J'ai une tite question.
Je suis avec python 2.4.1 sous win 2000.
Je me retrouve à devoir effacer un répertoire contenant des fichiers flagués lecture seule !
J'utilisais la méthode shutil.rmtree(path, ignore_errors=False, onerror=None)
Seulement, celle-ci lève une exception, et donc n'efface pas mon répertoire.

Que dois-je utiliser à la place (si ça existe ;) ), pour que mon répertoire soit correctement effacé ?
Si quelqu'un a une idée, je suis preneur vous vous en doutez ;)

d'avance MERCI de votre aide.
Fouff

5 réponses

Avatar
Jerome
Fouff wrote:
Bien le bonjour à toutes et à tous.

J'ai une tite question.
Je suis avec python 2.4.1 sous win 2000.
Je me retrouve à devoir effacer un répertoire contenant des fichiers
flagués lecture seule !
J'utilisais la méthode shutil.rmtree(path, ignore_errorsúlse,
onerror=None)
Seulement, celle-ci lève une exception, et donc n'efface pas mon
répertoire.

Que dois-je utiliser à la place (si ça existe ;) ), pour que mon
répertoire soit correctement effacé ?
Si quelqu'un a une idée, je suis preneur vous vous en doutez ;)

d'avance MERCI de votre aide.
Fouff


Bonjour,
j'imagine que pour effacer un fichier en lecture seule le plus simple
est d'utiliser la fonction chmod du module os pour modifier cet
attribut. Je ne suis pas sûr du fonctionnement de windows 2000 pour les
configurations multi-utilisateurs mais sous *nix il faut être
propriétaire du fichier pour pouvoir le faire.


Jérôme

Avatar
Laurent Pointal
Fouff wrote:
Bien le bonjour à toutes et à tous.

J'ai une tite question.
Je suis avec python 2.4.1 sous win 2000.
Je me retrouve à devoir effacer un répertoire contenant des fichiers
flagués lecture seule !
J'utilisais la méthode shutil.rmtree(path, ignore_errorsúlse,
onerror=None)
Seulement, celle-ci lève une exception, et donc n'efface pas mon
répertoire.

Que dois-je utiliser à la place (si ça existe ;) ), pour que mon
répertoire soit correctement effacé ?
Si quelqu'un a une idée, je suis preneur vous vous en doutez ;)

d'avance MERCI de votre aide.
Fouff


Bonjour,
j'imagine que pour effacer un fichier en lecture seule le plus simple
est d'utiliser la fonction chmod du module os pour modifier cet
attribut. Je ne suis pas sûr du fonctionnement de windows 2000 pour les
configurations multi-utilisateurs mais sous *nix il faut être
propriétaire du fichier pour pouvoir le faire.


Jérôme


+ le paramètre onerror de rmtree est une fonction, tu devrais pouvoir y
traiter le cas des fichiers flaggés lecture seule en les remettant rw et
en ré-essayant immédiatement de les supprimer...


Avatar
Fouff
Fouff wrote:
Bien le bonjour à toutes et à tous.

J'ai une tite question.
Je suis avec python 2.4.1 sous win 2000.
Je me retrouve à devoir effacer un répertoire contenant des fichiers
flagués lecture seule !
J'utilisais la méthode shutil.rmtree(path, ignore_errorsúlse,
onerror=None)
Seulement, celle-ci lève une exception, et donc n'efface pas mon
répertoire.

Que dois-je utiliser à la place (si ça existe ;) ), pour que mon
répertoire soit correctement effacé ?
Si quelqu'un a une idée, je suis preneur vous vous en doutez ;)

d'avance MERCI de votre aide.
Fouff
Bonjour,

j'imagine que pour effacer un fichier en lecture seule le plus simple
est d'utiliser la fonction chmod du module os pour modifier cet
attribut. Je ne suis pas sûr du fonctionnement de windows 2000 pour les
configurations multi-utilisateurs mais sous *nix il faut être
propriétaire du fichier pour pouvoir le faire.


Jérôme




+ le paramètre onerror de rmtree est une fonction, tu devrais pouvoir y
traiter le cas des fichiers flaggés lecture seule en les remettant rw et
en ré-essayant immédiatement de les supprimer...


J'ai effectivement adopté cette méthode.
MERCI beaucoup pour vos réponses :)



Avatar
Méta-MCI
Bonsoir !

[1/2 HS]

En complément de la réponse, il arrive qu'il soit vraiment impossible de
supprimer un fichier.
Par exemple, si Windows a posé un verrou système, car ce fichier était en
cours d'utilisation, par un autre utilisateur/poste (et, bien sûr,
l'utilisateur a mis son ordinateur en veille, puis il est parti en vacances,
malgré les fichiers ouverts).

Certes, on peut ôter les verrous dans Windows ; mais il arrive que les
fichiers ne puissent malgré tout pas être supprimés.

Une (bonne) solution, alors, c'est UNLOCKER
(http://ccollomb.free.fr/unlocker/)


@-salutations
--
Michel Claveau
Avatar
Regis

Je me retrouve à devoir effacer un répertoire contenant des f ichiers
flagués lecture seule !


En utilisant les extension Win32 sous Python tu peux remettre à "NOR MAL" les attributs
comme dans le script ici :

Note pour M.C :Et oui Michel C. les répertoires son "encore" tapé s en dur!
et à l'époque je ne connaissais pas encore la fonction WALK() !
bref vive la récurence....
Mais ça fonctionne pour mon parc...


#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# IUP de Calais - Fevrier 2005 - vers.1.0
# Régis Sion
# ################################ #
# Effacement de fichiers en bloc. #
# ################################ #
#
# Nettoyage du répertoire Document and Setting des postes de TP
# Attention aux paramètres : drive et nom de répertoire
# Seuls les sous-rep. iup,administrateur,adm,All Users, LocalService, Net workService et Default User
# ne seront pas effacés
# import shutil
import os
import win32con
import win32api
import win32file
from string import replace
# Entrez ici le suffixe de la racine du répertoire REPxx à net toyer
chemin= u'C:Documents and Settings' # objet forcé en UNICODE pou r la fonction listdir
chemin2 = u'C:Documents and SettingsiupLocal SettingsTemp'
#chemin= u'C:test python' # objet forcé en UNICODE pour la fon ction listdir
Ldir=['iup','Administrateur','adm','adm.SAMBAIUPC','All Users', 'LocalS ervice', 'NetworkService','Default User']
# Fonction principale (récursive ))
def deldir(path):
for file in os.listdir(path):
file_or_dir = os.path.join(path,file)
if os.path.isdir(file_or_dir) and not os.path.islink(file_or_dir): # test si "file" est un répertoire?
if file in Ldir: # attention il ne faut pas tester le chemin complet!
print "Rep.de base NON EFFACE :", file_or_dir
else:
deldir(file_or_dir) #c'est un répertoire, appel ré cursif de la même fonction
try:
os.rmdir(file_or_dir) # effacement du répertoire co nteneur.
except:
#print "change attribut ro et efface => ", file_or_dir
win32file.SetFileAttributesW(file_or_dir, win32con.FILE_ ATTRIBUTE_NORMAL)
try:
os.rmdir(file_or_dir) # effacement du répertoir e conteneur.
except:
print "Repertoire non efface car non vide =>",file _or_dir
else:
if os.path.isfile(file_or_dir):
try:
os.remove(file_or_dir) # c'est un fichier ,donc on l'eff ace
except:
#erreur ce n'est sans doute pas un fichier normal
win32file.SetFileAttributesW(file_or_dir, win32con.FILE_ ATTRIBUTE_NORMAL)
try:
os.remove(file_or_dir) # c'est un fichier ,donc on l 'efface
except:
print "erreur sur fichier:" ,file_or_dir
else:
print "fichier curieux! non efface =>", file_or_dir
# Mainprgm
# effacment du contenu de chemin
if os.path.isdir(chemin):
print chemin
deldir(chemin)
else:
print chemin, "n'existe pas"
# effacement du contenu de chemin2
if os.path.isdir(chemin2):
print chemin2
deldir(chemin2)
else:
print chemin2, "n'existe pas"

print 'fin du traitement - Deltree'
# fin de fichier