Attendre qu'un fichier soit entièrement écrit
Dans certains scénarios, il est crucial de s'assurer que les opérations de copie de fichiers ne commencent que lorsque le fichier source est entièrement écrit. Malheureusement, cela peut être difficile lorsqu'il s'agit de fichiers volumineux, car des tentatives de copie prématurées peuvent entraîner l'erreur redoutée « Impossible de copier le fichier, car il est utilisé par un autre processus ».
Une solution de contournement au problème.
Bien qu'il n'existe pas de solution complète à ce problème, il existe une solution de contournement qui consiste à vérifier périodiquement si le fichier est toujours en cours de modification avant de lancer le processus de copie. Voici deux méthodes pour accomplir cette tâche :
Méthode 1
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { return true; } finally { if (stream != null) stream.Close(); } return false; }
Cette méthode tente d'ouvrir le fichier pour un accès exclusif et renvoie vrai si le fichier est verrouillé (c'est-à-dire toujours en cours d'écriture ou de traitement par un autre thread).
Méthode 2
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { if (File.Exists(file)) { FileStream stream = null; try { stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (Exception ex2) { int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1); if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION)) { return true; } } finally { if (stream != null) stream.Close(); } } return false; }
Cette méthode vérifie à la fois l'existence du fichier et sa disponibilité pour un accès exclusif, renvoyant true si le fichier est verrouillé (c'est-à-dire inaccessible en raison d'un partage ou d'une violation de verrouillage).
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!