2010-11-07 11 views
0

Dans mon travail, je travaille avec une grande application .NET qui écrit dans un fichier journal. Appelons l'application CompanyApplication. J'ai écrit un simple script Python qui efface le journal:Effacement d'un fichier journal en cours d'utilisation

file_object = open('C:\\log.txt', 'w') 
file_object.write("") 
file_object.close() 

Lorsque CompanyApplication.exe n'est pas en cours d'exécution cela fonctionne correctement. Toutefois, lorsque CompanyApplication.exe est en cours d'exécution, je reçois cette erreur:

Traceback (most recent call last):
File "deleteLog.py", line 1, in <module>
file_object = open('C:\log.txt', 'w')
IOError: [Errno 13] Permission denied: 'C:\log.txt'

Ce doit être parce que CompanyApplication détient un verrou sur le fichier journal. Est-il possible de "déverrouiller" le fichier journal, l'effacer, puis "remettre le verrou" à CompanyApplication? Je préférerais une solution qui pourrait être automatisée (c'est pourquoi j'ai écrit le script Python en premier lieu). Infos supplémentaires: Il n'y a que peu de choses que je peux faire pour changer CompanyApplication lui-même. J'utilise Windows XP Pro. J'ai des privilèges d'administrateur.

+0

Je suppose que la gestion de 'SIGHUP' est terminée ... –

Répondre

3

Vous devez remplir le paramètre FileShare pour l'appel ouvert sur le fichier journal dans votre programme .NET.

Plus précisément, vous voulez allow read/write sharing. En fonction du fonctionnement de votre application .NET lors de l'écriture dans le journal, ce que vous suggérez pourrait ne pas fonctionner comme prévu et provoquer des problèmes avec le programme .NET.

Vous pouvez simplement démarrer un thread dans le programme .NET qui crée un événement et l'attend. Plus tard, vous pouvez définir cet événement à partir de votre programme Python et le .NET va effacer son propre fichier journal et réinitialiser l'événement en toute sécurité.

+0

Existe-t-il une manière équivalente de définir un paramètre de type FileShare lors de l'ouverture d'un handle de fichier en Python sous Windows? – rakslice

0

Non. Comme vous l'avez dit, CompanyApplication a un verrouiller sur le fichier. Quel serait le but d'un verrou si une autre application peut le déverrouiller à tout moment?

+0

Eh bien, à la fin de la journée à la fois CompanyApplication et le script Python ont été lancés par moi, un être humain avec des privilèges d'administrateur. – user181813

1

Il est probable que la sortie du fichier soit mise en mémoire tampon. Ainsi, même si vous pouviez prendre en charge le fichier et le vider, vous ne seriez pas en mesure de vider le tampon dans le programme en cours d'exécution. Le résultat serait soit une entrée partielle au début du fichier, soit que le programme continue à écrire à la position précédente, ce qui remplirait tout à ce point d'ordures.

Pour pouvoir vider le journal pendant l'exécution de l'application, vous devez réécrire la connexion dans l'application. Il doit uniquement ouvrir le fichier journal en cas de besoin et le fermer après l'avoir écrit. De cette façon, votre script peut tenter d'effacer le fichier, et s'il échoue, il peut attendre un moment, puis réessayer.