File.Move ne fonctionne pas – Le fichier existe déjà

J’ai un dossier:

c: \ test

J’essaie ce code:

File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test"); 

Je reçois une exception:

Le fichier existe déjà

Le répertoire de sortie existe bien et le fichier d’entrée est là.

Vous devez le déplacer vers un autre fichier (plutôt qu’un dossier), cela peut également être utilisé pour renommer.

Bouge toi:

 File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); 

Renommer:

 File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt"); 

La raison pour laquelle il est dit “Fichier existe déjà” dans votre exemple est que C:\test\Test essaie de créer un fichier Test sans extension, mais ne peut pas le faire car un dossier existe déjà avec le même nom.

Ce dont vous avez besoin est:

 if (!File.Exists(@"c:\test\Test\SomeFile.txt")) { File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); } 

ou

 if (File.Exists(@"c:\test\Test\SomeFile.txt")) { File.Delete(@"c:\test\Test\SomeFile.txt"); } File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt"); 

Ce sera soit:

  • Si le fichier n’existe pas à l’emplacement de destination, déplacez le fichier avec succès ou;
  • Si le fichier existe à l’emplacement de destination, supprimez-le, puis déplacez le fichier.

Edit: Je devrais clarifier ma réponse, même si c’est la plus votée! Le deuxième paramètre de File.Move devrait être le fichier de destinationpas un dossier. Vous spécifiez le deuxième paramètre en tant que dossier de destination, pas le nom du fichier de destination – ce que File.Move requirejs. Donc, votre deuxième paramètre devrait être c:\test\Test\SomeFile.txt .

Personnellement, je préfère cette méthode. Cela écrase le fichier sur la destination, supprime le fichier source et empêche également la suppression du fichier source lorsque la copie échoue.

 ssortingng source = @"c:\test\SomeFile.txt"; ssortingng destination = @"c:\test\test\SomeFile.txt"; try { File.Copy(source, destination, true); File.Delete(source); } catch { //some error handling } 

Si le fichier existe vraiment et que vous souhaitez le remplacer, utilisez le code ci-dessous:

 ssortingng file = "c:\test\SomeFile.txt" ssortingng moveTo = "c:\test\test\SomeFile.txt" if (File.Exists(moveTo)) { File.Delete(moveTo); } File.Move(file, moveTo); 

Vous pouvez faire un P / Invoke à MoveFileEx() – passer 11 pour les flags ( MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH )

 [return: MarshalAs(UnmanagedType.Bool)] [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)] static extern bool MoveFileEx(ssortingng existingFileName, ssortingng newFileName, int flags); 

Ou, vous pouvez simplement appeler

 Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true); 

après avoir ajouté Microsoft.VisualBasic comme référence.

Selon les documents de File.Move, il n’y a pas de paramètre “écraser si existe”. Vous avez essayé de spécifier le dossier de destination, mais vous devez fournir la spécification de fichier complète.

Lire les documents à nouveau (“offrant la possibilité de spécifier un nouveau nom de fichier”), je pense que l’ ajout d’une barre oblique inverse à la spécification du dossier de destination peut fonctionner.

Essayez Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True) . Le dernier paramètre est le commutateur Écraser, que System.IO.File.Move ne possède pas.