web-dev-qa-db-fra.com

Comment copier des fichiers en écrasant des fichiers existants?

Aperçu

Comment copier tous les fichiers d'un répertoire dans un autre répertoire et écraser tous les fichiers existants portant le même nom dans le répertoire cible avec C #?

J'ai le code suivant pour copier les fichiers d'un répertoire vers un autre répertoire ...

const string sourceDir = @"C:\AppProject\Smart\SmartStaff\site\document";
const string targetDir = @"C:\AppProject\Smart\ExternalSmartStaff\site\document";
foreach (var file in Directory.GetFiles(sourceDir))
    File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)));

..., mais lorsque le répertoire cible contient déjà un fichier du même nom qu'un fichier du répertoire source, il échoue avec l'erreur System.IO.IOException: The file 'C:\AppProject\Smart\ExternalSmartStaff\site\document\SomeDocument.txt' already exists..

Détails

Pour être clair, étant donné les répertoires et fichiers suivants en eux ...

C:\>dir C:\AppProject\Smart\SmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\SmartStaff\site\document

09/03/2014  06:38 PM    <DIR>          .
09/03/2014  06:38 PM    <DIR>          ..
05/25/2014  08:29 PM                44 SomeDocument.txt
05/25/2014  08:32 PM                21 SomeDocument2.txt
05/25/2014  08:36 PM                21 SomeDocument3.txt
05/25/2014  08:43 PM                44 SomeDocument4.txt
               4 File(s)            130 bytes
               2 Dir(s)  128,326,766,592 bytes free

C:\>dir C:\AppProject\Smart\ExternalSmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\ExternalSmartStaff\site\document

09/03/2014  06:39 PM    <DIR>          .
09/03/2014  06:39 PM    <DIR>          ..
09/03/2014  06:39 PM                26 SomeDocument.txt
09/03/2014  06:39 PM                54 SomeDocument2.txt
               2 File(s)             80 bytes
               2 Dir(s)  128,326,766,592 bytes free

..., Je voudrais C:\AppProject\Smart\ExternalSmartStaff\site\document pour ressembler à ceci après la copie du fichier en C #:

C:\>dir C:\AppProject\Smart\ExternalSmartStaff\site\document
 ...

 Directory of C:\AppProject\Smart\ExternalSmartStaff\site\document

09/03/2014  06:47 PM    <DIR>          .
09/03/2014  06:47 PM    <DIR>          ..
05/25/2014  08:29 PM                44 SomeDocument.txt
05/25/2014  08:32 PM                21 SomeDocument2.txt
05/25/2014  08:36 PM                21 SomeDocument3.txt
05/25/2014  08:43 PM                44 SomeDocument4.txt
               4 File(s)            130 bytes
               2 Dir(s)  128,327,835,648 bytes free

Comment puis-je éviter le IOException et accomplir cela?

16
Jin Yong

Essaye ça:

const string sourceDir = @"C:\AppProject\Smart\SmartStaff\site\document";
const string targetDir = @"C:\AppProject\Smart\ExternalSmartStaff\site\document";
foreach (var file in Directory.GetFiles(sourceDir))
    File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)), true);

Fondamentalement, il vous suffit d'appeler une surcharge différente de File.Copy. documentation MSDN explique que le troisième paramètre bool est d'indiquer s'il faut remplacer les fichiers existants par les fichiers copiés.

28
J0e3gan

Plutôt utiliser

Méthode File.Copy (String, String, Boolean)

Copie un fichier existant dans un nouveau fichier. L'écrasement d'un fichier du même nom est autorisé.

overwriteType: System.Boolean

true si le fichier de destination peut être écrasé; sinon, faux.

7
Adriaan Stander

Ceci est une solution

foreach (string path in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
    File.Copy(path, path.Replace(SourcePath, DestinationPath));
4
Maryam Arshi

Le File.Copy la méthode a une surcharge qui permet d'écraser les fichiers existants avec le même nom. Voir http://msdn.Microsoft.com/en-us/library/9706cfs5.aspx .

2
cvraman