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à.
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à.
Réponses:
Vous devez le déplacer vers un autre fichier (plutôt qu'un dossier), cela peut également être utilisé pour le 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 indiqué «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 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");
Cela va 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 doit être le fichier de destination et non un dossier. Vous spécifiez le deuxième paramètre comme dossier de destination, et non comme nom de fichier de destination - ce qui est requis par File.Move. Donc, votre deuxième paramètre devrait ê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
}
File.Copy , File.Delete
plus File.Move
?
Vous pouvez faire un P / Invoke to MoveFileEx()
- passer 11 pour 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.
Si le fichier existe vraiment et que vous souhaitez 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);
Selon la documentation de File.Move, il n'y a pas de paramètre «écraser s'il existe». Vous avez essayé de spécifier le dossier de destination , mais vous devez donner la spécification complète du fichier.
En lisant à nouveau la documentation ("fournir 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.
Move(String, String, Boolean)
place. mais cela semble être une erreur?
1) Avec C # sur .Net Core 3.0 et au-delà, il existe désormais un troisième paramètre booléen:
voir https://docs.microsoft.com/en-us/dotnet/api/system.io.file.move?view=netcore-3.1
In .NET Core 3.0 and later versions, you can call Move(String, String, Boolean) setting the parameter overwrite to true, which will replace the file if it exists.
2) Pour toutes les autres versions de .Net, https://stackoverflow.com/a/42224803/887092 est la meilleure réponse. Copiez avec écrasement, puis supprimez le fichier source. C'est mieux car cela en fait une opération atomique. (J'ai essayé de mettre à jour les documents MS avec ceci)
Essayez Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Le dernier paramètre est le commutateur d'écrasement, qui System.IO.File.Move
n'a pas.
Si vous n'avez pas la possibilité de supprimer le fichier déjà existant dans le nouvel emplacement, mais que vous devez tout de même déplacer et supprimer de l'emplacement d'origine, cette astuce de changement de nom peut fonctionner:
string newFileLocation = @"c:\test\Test\SomeFile.txt";
while (File.Exists(newFileLocation)) {
newFileLocation = newFileLocation.Split('.')[0] + "_copy." + newFileLocation.Split('.')[1];
}
File.Move(@"c:\test\SomeFile.txt", newFileLocation);
Cela suppose le seul "." dans le nom du fichier est avant l'extension. Il divise le fichier en deux avant l'extension, joint "_copy". entre. Cela vous permet de déplacer le fichier, mais crée une copie si le fichier existe déjà ou une copie de la copie existe déjà, ou une copie de la copie de la copie existe ...;)