Saya punya folder:
c: \ test
Saya mencoba kode ini:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Saya mendapatkan pengecualian:
File sudah ada
Direktori keluaran pasti ada dan file masukan ada di sana.
Saya punya folder:
c: \ test
Saya mencoba kode ini:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
Saya mendapatkan pengecualian:
File sudah ada
Direktori keluaran pasti ada dan file masukan ada di sana.
Jawaban:
Anda perlu memindahkannya ke file lain (bukan folder), ini juga dapat digunakan untuk mengganti nama.
Pindah:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Ganti nama:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
Alasan yang dikatakan "File sudah ada" dalam contoh Anda, adalah karena C:\test\Test
mencoba membuat file Test
tanpa ekstensi, tetapi tidak dapat melakukannya karena folder dengan nama yang sama sudah ada.
Yang Anda butuhkan adalah:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
atau
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");
Ini akan:
Sunting: Saya harus mengklarifikasi jawaban saya, meskipun itu yang paling disukai! Parameter kedua dari File.Move harus menjadi file tujuan - bukan folder. Anda menentukan parameter kedua sebagai folder tujuan, bukan nama file tujuan - yang dibutuhkan oleh File.Move. Jadi, parameter kedua Anda seharusnya c:\test\Test\SomeFile.txt
.
Secara pribadi saya lebih suka metode ini. Ini akan menimpa file di tujuan, menghapus file sumber dan juga mencegah penghapusan file sumber saat penyalinan gagal.
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
lebih File.Move
?
Anda dapat melakukan P / Invoke untuk MoveFileEx()
- lulus 11 untuk 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);
Atau, Anda bisa menelepon
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
setelah menambahkan Microsoft.VisualBasic sebagai referensi.
Jika file benar-benar ada dan Anda ingin menggantinya gunakan kode di bawah ini:
string file = "c:\test\SomeFile.txt"
string moveTo = "c:\test\test\SomeFile.txt"
if (File.Exists(moveTo))
{
File.Delete(moveTo);
}
File.Move(file, moveTo);
1) Dengan C # pada .Net Core 3.0 dan seterusnya, sekarang ada parameter boolean ketiga:
lihat 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) Untuk semua versi .Net lainnya, https://stackoverflow.com/a/42224803/887092 adalah jawaban terbaik. Salin dengan Timpa, lalu hapus file sumber. Ini lebih baik karena menjadikannya operasi atom. (Saya telah mencoba memperbarui MS Docs dengan ini)
Menurut dokumen untuk File.Move, tidak ada parameter "timpa jika ada". Anda mencoba menentukan folder tujuan , tetapi Anda harus memberikan spesifikasi file yang lengkap.
Membaca dokumen lagi ("memberikan opsi untuk menentukan nama file baru"), menurut saya , menambahkan garis miring terbalik ke spesifikasi folder tujuan mungkin berhasil.
Move(String, String, Boolean)
saja. tapi sepertinya itu salah?
Coba Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Parameter terakhir adalah sakelar Timpa, yang System.IO.File.Move
tidak memiliki.
Jika Anda tidak memiliki opsi untuk menghapus file yang sudah ada di lokasi baru, tetapi masih perlu memindahkan dan menghapus dari lokasi asli, trik mengganti nama ini mungkin berhasil:
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);
Ini mengasumsikan satu-satunya '.' di nama file sebelum ekstensi. Ini membagi file menjadi dua sebelum ekstensi, melampirkan "_copy." diantara. Ini memungkinkan Anda memindahkan file, tetapi membuat salinan jika file sudah ada atau salinan salinan sudah ada, atau salinan salinannya sudah ada ...;)