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à.
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à.
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:
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
.
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
}
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);
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.
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.
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.