Maison > développement back-end > C++ > Comment éviter les erreurs « Impossible de copier le fichier, car il est utilisé par un autre processus » lors de la copie de fichiers ?

Comment éviter les erreurs « Impossible de copier le fichier, car il est utilisé par un autre processus » lors de la copie de fichiers ?

Patricia Arquette
Libérer: 2025-01-01 01:47:10
original
357 Les gens l'ont consulté

How to Prevent

Assurer l'achèvement de l'écriture du fichier avant la copie

Lorsque vous travaillez avec des fichiers dans plusieurs répertoires, il est crucial de s'assurer que les fichiers sont entièrement écrits avant de tenter de les copier. Cela évite l'erreur « Impossible de copier le fichier, car il est utilisé par un autre processus ».

Dans le code fourni, un FileSystemWatcher est créé pour surveiller les événements de création de fichiers dans un répertoire spécifié. Lorsqu'un nouveau fichier est créé, un gestionnaire d'événements le copie dans un autre répertoire. Cependant, lors de la copie de fichiers plus volumineux, le problème survient en raison d'une copie prématurée, entraînant l'erreur susmentionnée.

Pour résoudre ce problème, une solution de contournement est nécessaire. Considérez les méthodes suivantes :

Méthode 1 :

private bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        // the file is unavailable because it is:
        // - still being written to
        // - being processed by another thread
        // - does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    // file is not locked
    return false;
}
Copier après la connexion

Méthode 2 :

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
    // check that problem is not in destination file
    if (File.Exists(file) == true)
    {
        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;
}
Copier après la connexion

Ces méthodes peuvent être utilisé pour déterminer si un fichier est verrouillé avant de tenter de le copier. Cela garantit que l'opération de copie se produit uniquement lorsque le fichier est entièrement écrit, éliminant ainsi l'erreur « Impossible de copier le fichier, car il est utilisé par un autre processus ».

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal