Savoir si un .zip est en cours d'écriture

Savoir si un .zip est en cours d'écriture - C#/.NET managed - Programmation

Marsh Posté le 21-09-2011 à 15:35:44    

Bonjour,
 
Connaissez-vous une solution (si cela est possible) pour savoir si un zip est en cours d'écriture.
 
L'idée étant qu'un robot scanne un répertoire dans lequel des zip sont déposés, je voudrais déplacer les zips qu'une fois leur écriture terminée, en sachant que je n'ai pas la main sur l'écriture de ce zip (généré par un tiers).
 
Et je voudrais me passer de l'envoi par le tiers d'un fichier EOF après l'écriture du zip.
 
je ne sais pas si je suis clair...
 
Merci


---------------
I drive at 88mph ! Just in case...
Reply

Marsh Posté le 21-09-2011 à 15:35:44   

Reply

Marsh Posté le 21-09-2011 à 15:54:12    

Plusieurs solutions :

  • (si le .zip est généré à la volée) Voir avec le tiers pour passer par un répertoire d'écriture, et faire déplacer le fichier vers son lieu de dépôt une fois l'écriture terminée
  • (si le fichier est transféré) Faire transférer sous une extension temporaire, et renommer une fois le transfert terminé
  • (si rien de tout cela n'est envisageable) Vérifier la date de dernière modification du fichier, et attendre qu'elle soit plus vieille que, je ne sais pas, 30s ou 1min pour commencer à le traiter.


Ce n'est pas exhaustif, surtout que je connais mal le monde windows, mais on doit pouvoir trouver d'autres solutions, de la plus crade à la plus sympa...

Message cité 1 fois
Message édité par Elmoricq le 21-09-2011 à 15:58:37
Reply

Marsh Posté le 21-09-2011 à 16:10:17    

Elmoricq a écrit :

Plusieurs solutions :


  • (si le .zip est généré à la volée) Voir avec le tiers pour passer par un répertoire d'écriture, et faire déplacer le fichier vers son lieu de dépôt une fois l'écriture terminée
  • (si le fichier est transféré) Faire transférer sous une extension temporaire, et renommer une fois le transfert terminé
  • (si rien de tout cela n'est envisageable) Vérifier la date de dernière modification du fichier, et attendre qu'elle soit plus vieille que, je ne sais pas, 30s ou 1min pour commencer à le traiter.


Ce n'est pas exhaustif, surtout que je connais mal le monde windows, mais on doit pouvoir trouver d'autres solutions, de la plus crade à la plus sympa...Ah mais c'est carrément pas bête ça !  
Ca me convient même très bien :)
 
Merci


---------------
I drive at 88mph ! Just in case...
Reply

Marsh Posté le 21-09-2011 à 22:19:40    

Moi je testerais si le fichier est ouvrable en écriture. Théoriquement si le programme qui le copie n'a pas fini, l'accès devrait être refusé si le fichier n'as pas été ouvert en FILE_SHARE_WRITE ( http://msdn.microsoft.com/en-us/li [...] 85%29.aspx - sais pas ce que ca donne en .net par contre, ni si c'est un comportement obligatoire/par défaut!) ?
(surtout qu'il y a moyen de désactivé la mise à jour des informations d'accès au fichier sur du ntfs pour "plus de rapidité", c'est un tweak assez connu: http://www.pctools.com/guides/registry/detail/50/ )
edit je sais plus combien: en  win api 32 je pense que tu connais cette fonction http://msdn.microsoft.com/en-us/li [...] 85%29.aspx , je ne sais pas si elle a un équivalent .net!)


Message édité par breizhbugs le 21-09-2011 à 22:29:20

---------------
Seul Google le sait...
Reply

Marsh Posté le 22-09-2011 à 08:59:08    

Code :
  1. void copy(string path) {
  2. var isFree = false;
  3. try {
  4.   //on essaie de l'ouvrir
  5.   using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)) {
  6.       //on teste si on peut le lire ou l'écrire
  7.       isFree = fs.CanRead // or
  8.       isFree = fs.CanWrite
  9.       }
  10.     }
  11.   catch (IOException ex) {
  12.      <bla bla bla, le fichier n'est pas accessible>
  13.       }
  14. if (!isFree) return;
  15. //sinon c'est bon, on copie
  16. }

Message cité 1 fois
Message édité par deliriumtremens le 22-09-2011 à 09:02:42
Reply

Marsh Posté le 22-09-2011 à 09:48:25    

deliriumtremens a écrit :

Code :
  1. void copy(string path) {
  2. var isFree = false;
  3. try {
  4.   //on essaie de l'ouvrir
  5.   using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate)) {
  6.       //on teste si on peut le lire ou l'écrire
  7.       isFree = fs.CanRead // or
  8.       isFree = fs.CanWrite
  9.       }
  10.     }
  11.   catch (IOException ex) {
  12.      <bla bla bla, le fichier n'est pas accessible>
  13.       }
  14. if (!isFree) return;
  15. //sinon c'est bon, on copie
  16. }




Merci beaucoup, marche très bien cela :)


---------------
I drive at 88mph ! Just in case...
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed