Mam folder:
c: \ test
Próbuję tego kodu:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Dostaję wyjątek:
plik już istnieje
Katalog wyjściowy na pewno istnieje i plik wejściowy tam jest.
Mam folder:
c: \ test
Próbuję tego kodu:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Dostaję wyjątek:
plik już istnieje
Katalog wyjściowy na pewno istnieje i plik wejściowy tam jest.
Odpowiedzi:
Musisz przenieść go do innego pliku (zamiast do folderu), można tego również użyć do zmiany nazwy.
Ruszaj się:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Przemianować:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
Powodem, dla którego w Twoim przykładzie jest napisane „Plik już istnieje”, jest C:\test\Test
próba utworzenia pliku Test
bez rozszerzenia, ale nie może tego zrobić, ponieważ istnieje już folder o tej samej nazwie.
Potrzebujesz:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
lub
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");
Spowoduje to:
Edycja: Powinienem wyjaśnić moją odpowiedź, mimo że jest najbardziej pozytywna! Drugim parametrem File.Move powinien być plik docelowy - nie folder. Określasz drugi parametr jako folder docelowy, a nie docelową nazwę pliku - tego wymaga File.Move. Zatem twoim drugim parametrem powinien być c:\test\Test\SomeFile.txt
.
Osobiście wolę tę metodę. Spowoduje to nadpisanie pliku w miejscu docelowym, usunięcie pliku źródłowego, a także zapobiegnie usunięciu pliku źródłowego w przypadku niepowodzenia kopiowania.
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
nad File.Move
?
Możesz wykonać 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);
Możesz też po prostu zadzwonić
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
po dodaniu Microsoft.VisualBasic jako odniesienia.
Jeśli plik naprawdę istnieje i chcesz go zastąpić użyj poniższego kodu:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
Zgodnie z dokumentacją File.Move nie ma parametru „nadpisać, jeśli istnieje”. Próbowałeś określić folder docelowy , ale musisz podać pełną specyfikację pliku.
Czytając dokumenty ponownie („zapewniając opcję określenia nowej nazwy pliku”), myślę , że dodanie ukośnika odwrotnego do specyfikacji folderu docelowego może działać.
Move(String, String, Boolean)
. ale wydaje się, że to pomyłka?
1) W przypadku języka C # w .Net Core 3.0 i nowszych jest teraz trzeci parametr boolowski:
zobacz 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) W przypadku wszystkich innych wersji .Net, https://stackoverflow.com/a/42224803/887092 jest najlepszą odpowiedzią. Skopiuj z Zastąp, a następnie usuń plik źródłowy. To jest lepsze, ponieważ sprawia, że jest to operacja atomowa. (Próbowałem zaktualizować dokumenty MS za pomocą tego)
Spróbuj Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Ostatnim parametrem jest przełącznik Overwrite, którego System.IO.File.Move
nie ma.
Jeśli nie masz opcji usunięcia już istniejącego pliku w nowej lokalizacji, ale nadal musisz przenieść i usunąć z oryginalnej lokalizacji, ta sztuczka zmiany nazwy może zadziałać:
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);
To zakłada jedyny „.” w nazwie pliku znajduje się przed rozszerzeniem. Dzieli plik na dwie części przed rozszerzeniem i dołącza „_copy”. pomiędzy. Pozwala to przenieść plik, ale tworzy kopię, jeśli plik już istnieje lub kopia kopii już istnieje, lub kopia kopii kopii istnieje ...;)