Maison >développement back-end >C++ >Comment garantir l'achèvement du fichier avant la copie pour éviter les erreurs « Fichier en cours d'utilisation » ?
Assurer l'achèvement du fichier avant la copie
Dans le scénario où un FileSystemWatcher est utilisé pour détecter la création de fichiers dans un répertoire et les copier ensuite vers un emplacement différent, un problème survient lorsque des fichiers volumineux (> 10 Mo) sont impliqués. L'erreur « Impossible de copier le fichier, car il est utilisé par un autre processus » peut survenir en raison du démarrage du processus de copie avant la fin de la création du fichier.
Solution de contournement :
La seule solution connue consiste à vérifier si le fichier est verrouillé avant de lancer l'opération de copie. Ceci peut être réalisé grâce à une fonction qui vérifie à plusieurs reprises si le fichier est en cours d'utilisation jusqu'à ce qu'il renvoie false, indiquant que le fichier n'est plus verrouillé.
Méthode 1 (copie directe) :
private bool IsFileLocked(FileInfo file) { FileStream stream = null; try { stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); } catch (IOException) { // File still being written, processed, or doesn't exist return true; } finally { if (stream != null) stream.Close(); } // File not locked return false; }
Méthode 2 :
const int ERROR_SHARING_VIOLATION = 32; const int ERROR_LOCK_VIOLATION = 33; private bool IsFileLocked(string file) { // Check destination file status 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; }
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!