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:
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 destination – pas 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.