Bir klasörüm var:
c: \ test
Bu kodu deniyorum:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
İstisna alıyorum:
dosya zaten mevcut
Çıktı dizini kesinlikle var ve girdi dosyası orada.
Bir klasörüm var:
c: \ test
Bu kodu deniyorum:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
İstisna alıyorum:
dosya zaten mevcut
Çıktı dizini kesinlikle var ve girdi dosyası orada.
Yanıtlar:
Onu başka bir dosyaya taşımanız gerekir (bir klasör yerine), bu aynı zamanda yeniden adlandırmak için de kullanılabilir.
Hareket:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
Adını değiştirmek:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
Örneğinizde "Dosya zaten var" C:\test\Test
ifadesinin nedeni Test
, uzantı olmadan bir dosya oluşturmaya çalışması , ancak aynı ada sahip bir klasör zaten mevcut olduğundan bunu yapamamasıdır.
İhtiyacınız olan şey:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
veya
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");
Bu ya:
Düzenleme: En çok oy alan cevap olmasına rağmen cevabımı netleştirmeliyim! File.Move ikinci parametre olmalıdır hedef dosya - değil bir klasör. İkinci parametreyi hedef klasör olarak belirtiyorsunuz, hedef dosya adı değil - File.Move bunu gerektiriyor. Öyleyse, ikinci parametreniz olmalıdır c:\test\Test\SomeFile.txt
.
Şahsen ben bu yöntemi tercih ediyorum. Bu, hedefteki dosyanın üzerine yazacak, kaynak dosyayı kaldıracak ve ayrıca kopyalama başarısız olduğunda kaynak dosyanın kaldırılmasını engelleyecektir.
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
üzerinde File.Move
?
( ) İçin 11'iMoveFileEx()
geçmek için bir P / Çağır yapabilirsinizflags
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);
Veya sadece arayabilirsin
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
Microsoft.VisualBasic'i referans olarak ekledikten sonra.
Dosya gerçekten mevcutsa ve değiştirmek istiyorsanız aşağıdaki kodu kullanın:
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) .Net Core 3.0 ve ötesinde C # ile, artık üçüncü bir boole parametresi var:
bkz. 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) .Net'in diğer tüm sürümleri için, https://stackoverflow.com/a/42224803/887092 en iyi yanıttır. Overwrite ile kopyalayın, ardından kaynak dosyayı silin. Bu daha iyi çünkü onu atomik bir operasyon yapıyor. (Bununla MS Belgelerini güncellemeye çalıştım)
File.Move dokümanlarına göre, "varsa üzerine yazma" parametresi yoktur. Hedef klasörü belirlemeye çalıştınız , ancak tam dosya özelliğini vermeniz gerekiyor.
( "Yeni bir dosya adı belirtmek için seçenek sunan") tekrar docs okuma, ben düşünüyorum çalışabilir hedef klasör spec için ters eğik çizgi ekleyerek.
Move(String, String, Boolean)
yerine arayın . ama bu bir hata gibi görünüyor?
Deneyin Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. Son parametre, System.IO.File.Move
sahip olmayan Üzerine Yazma anahtarıdır .
Yeni konumda zaten var olan dosyayı silme seçeneğiniz yoksa, ancak yine de orijinal konumundan taşınmanız ve silmeniz gerekiyorsa, bu yeniden adlandırma hilesi işe yarayabilir:
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);
Bu tek '.' dosya adındaki uzantının önünde. Dosyayı uzantıdan önce ikiye böler ve "_copy" ekler. arasında. Bu, dosyayı taşımanıza izin verir, ancak dosya zaten varsa veya kopyanın bir kopyası zaten varsa veya kopyanın bir kopyası varsa bir kopya oluşturur ...;)