web-dev-qa-db-fra.com

Comment copier un fichier en cours d'utilisation par un autre processus

Est-il possible de copier un fichier en cours d'utilisation par un autre processus simultanément?

Je demande parce que quand j'essaye de copier le fichier en utilisant le code suivant une exception est levée:

 System.IO.File.Copy(s, destFile, true);

L'exception soulevée est:

Le processus ne peut pas accéder au fichier 'D:\temp\1000000045.Zip' car il est utilisé par un autre processus.

Je ne veux pas créer un nouveau fichier, je veux juste le copier ou le supprimer. Est-ce possible?

28
Vir

Un exemple (note: je viens de combiner deux résultats Google, vous devrez peut-être corriger des erreurs mineures;))

La partie importante est le FileShare.ReadWrite lors de l’ouverture de FileStream.

J'utilise un code similaire pour ouvrir et lire des documents Excel alors qu'Excel est toujours ouvert et bloque le fichier.

  using(var inputFile = new FileStream(
         "oldFile.txt", 
         FileMode.Open, 
         FileAccess.Read, 
         FileShare.ReadWrite))
     {
        using (var outputFile = new FileStream("newFile.txt", FileMode.Create))
        { 
            var buffer = new byte[0x10000];
            int bytes;

            while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) 
            {
                outputFile.Write(buffer, 0, bytes);
            }
        }
    }
33
Zebi

Pour créer une copie d'un fichier verrouillé en lecture et/ou en écriture par un autre processus sous Windows, la solution la plus simple (et probablement la seule) consiste à utiliser le service VSS (Volume Shadow Copy Service).

Le service de cliché instantané de volume est complexe et difficile à appeler à partir de code géré. Heureusement, de beaux groupes ont créé une bibliothèque de classes .NET dans ce but. Découvrez le projet Alpha VSS sur CodePlex: http://alphavss.codeplex.com .

MODIFIER

Comme beaucoup de projets sur CodePlex, Alpha VSS a migré vers GitHub. Le projet est maintenant ici: https://github.com/alphaleonis/AlphaVSS

9
STLDev

Vous devriez explorer et découvrir quel processus bloque le fichier. Si ce processus ne vous appartient pas, vous n’avez aucun moyen de résoudre le problème. Bien sûr, vous pouvez appliquer quelques piratages et libérer manuellement le verrou de fichier, mais il est fort probable que cette approche aura des conséquences insoupçonnées. Si le processus vous appartient, essayez de déverrouiller le fichier ou de le verrouiller avec un accès en lecture partagée.

[MODIFIER]
Le moyen le plus simple de détecter le bloqueur consiste à utiliser Process Explorer . Lancez-le et entrez le nom du fichier dans la boîte de dialogue Find->Find Handle or DLL.... Dans les résultats de la recherche, vous pourrez voir quel processus bloque votre fichier. Vous pouvez aussi faire ce travail en C # vérifier ceci: Quel processus verrouille un fichier? . Également 

3
Anton Semenov

Non tu ne peux pas. Certains programmes ne verrouillent pas le fichier en lecture, mais s’ils le font, vous ne pourrez pas accéder au fichier sans tuer l’autre programme.

0
GolezTrol

Une autre option consiste à copier le fichier verrouillé quelque part à l'aide de la classe Process et à appeler CMD pour qu'il utilise la commande "copy". Dans la plupart des cas, la commande "copier" pourra faire une copie du fichier même s'il est utilisé par un autre processus, en contournant le problème C # File.Copy.

Exemple:

try
{
File.Copy(somefile)
}
catch (IOException e)
{
 if (e.Message.Contains("in use"))
                        {

                            Process.StartInfo.UseShellExecute = false;
                            Process.StartInfo.RedirectStandardOutput = true;                           
                            Process.StartInfo.FileName = "cmd.exe";
                            Process.StartInfo.Arguments = "/C copy \"" + yourlockedfile + "\" \"" + destination + "\"";
                            Process.Start();                            
                            Console.WriteLine(Process.StandardOutput.ReadToEnd());
                            Proess.WaitForExit();
                            Process.Close();                          
                        }
}

the try/catch should be added on top of your current try/catch to handle the file in use exception to allow your code to continue... 
0
MickeyM