web-dev-qa-db-fra.com

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

J'ai un dossier:

c:\test

J'essaye 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 définitivement et le fichier d'entrée est là.

70
Jack Kada

Vous devez le déplacer dans un autre fichier (plutôt que dans 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 "Le fichier existe déjà" dans votre exemple est que C:\test\Test tente de créer un fichier Test sans extension, mais ne peut pas le faire car un dossier portant déjà le même nom existe déjà.

56
Lee

Ce dont vous avez besoin c'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 correctement le fichier ou;
  • Si le fichier existe à l'emplacement de destination, supprimez-le, puis déplacez-le.

Edit: je devrais préciser ma réponse, même si c’est le plus voté! Le deuxième paramètre de File.Move devrait être le fichier de destination - pas un dossier. Vous spécifiez le deuxième paramètre comme dossier de destination, pas le nom du fichier de destination (qui correspond à ce que File.Move exige ..]. Votre deuxième paramètre doit donc être c:\test\Test\SomeFile.txt.

119

Personnellement, je préfère cette méthode . Cela écrasera le fichier sur la destination, supprimera le fichier source et empêchera également de supprimer le fichier source lorsque la copie échoue.

string source = @"c:\test\SomeFile.txt";
string destination = @"c:\test\test\SomeFile.txt";

try
{
    File.Copy(source, destination, true);
    File.Delete(source);
}
catch
{
    //some error handling
}
23
Mitchell

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

string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"

if (File.Exists(moveTo))
{
    File.Delete(moveTo);
}

File.Move(file, moveTo);
8
Pawel Czapski

Vous pouvez faire un P/Invoke to MoveFileEx() - pass 11 for 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(string existingFileName, string 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.

8
mheyman

Selon la documentation de File.Move il n’existe pas de paramètre "écraser si existe". Vous avez essayé de spécifier la destination dossier, mais vous devez indiquer la spécification complète du fichier.

En relisant la documentation ("offrant la possibilité de spécifier un nouveau nom de fichier"), je pense, l'ajout d'une barre oblique inverse à la spécification du dossier de destination peut fonctionner.

4
Ekkehard.Horner

Essayez Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True). Le dernier paramètre est le commutateur Overwrite, que System.IO.File.Move n'a pas.

0
Mark