ฉันมีโฟลเดอร์:
c: \ test
ฉันกำลังลองใช้รหัสนี้:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
ฉันได้รับข้อยกเว้น:
มีไฟล์อยู่แล้ว
ไดเร็กทอรีเอาต์พุตมีอยู่แน่นอนและไฟล์อินพุตอยู่ที่นั่น
ฉันมีโฟลเดอร์:
c: \ test
ฉันกำลังลองใช้รหัสนี้:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test");
ฉันได้รับข้อยกเว้น:
มีไฟล์อยู่แล้ว
ไดเร็กทอรีเอาต์พุตมีอยู่แน่นอนและไฟล์อินพุตอยู่ที่นั่น
คำตอบ:
คุณต้องย้ายไปยังไฟล์อื่น (แทนที่จะเป็นโฟลเดอร์) ซึ่งสามารถใช้เพื่อเปลี่ยนชื่อได้
ย้าย:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
เปลี่ยนชื่อ:
File.Move(@"c:\test\SomeFile.txt", @"c:\test\SomeFile2.txt");
สาเหตุที่ระบุว่า "มีไฟล์อยู่แล้ว" ในตัวอย่างของคุณเป็นเพราะC:\test\Test
พยายามสร้างไฟล์ที่Test
ไม่มีนามสกุล แต่ไม่สามารถทำได้เนื่องจากมีโฟลเดอร์ที่มีชื่อเดียวกันอยู่แล้ว
สิ่งที่คุณต้องการคือ:
if (!File.Exists(@"c:\test\Test\SomeFile.txt")) {
File.Move(@"c:\test\SomeFile.txt", @"c:\test\Test\SomeFile.txt");
}
หรือ
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");
สิ่งนี้จะ:
แก้ไข: ฉันควรชี้แจงคำตอบของฉันแม้ว่าจะมีการโหวตมากที่สุดก็ตาม! พารามิเตอร์ที่สองของ File.Move ควรจะเป็นแฟ้มปลายทาง - ไม่โฟลเดอร์ คุณกำลังระบุพารามิเตอร์ที่สองเป็นโฟลเดอร์ปลายทางไม่ใช่ชื่อไฟล์ปลายทางซึ่งเป็นสิ่งที่ File.Move ต้องการ c:\test\Test\SomeFile.txt
ดังนั้นพารามิเตอร์ที่สองของคุณควรจะ
โดยส่วนตัวแล้วฉันชอบวิธีนี้ การดำเนินการนี้จะเขียนทับไฟล์ที่ปลายทางลบไฟล์ต้นทางและป้องกันการลบไฟล์ต้นทางเมื่อคัดลอกล้มเหลว
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
มากกว่าFile.Move
?
คุณสามารถทำ P / Invoke to MoveFileEx()
- pass 11สำหรับ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);
หรือโทร
Microsoft.VisualBasic.FileIO.FileSystem.MoveFile(existingFileName, newFileName, true);
หลังจากเพิ่ม Microsoft.VisualBasic เป็นข้อมูลอ้างอิง
หากไฟล์มีอยู่จริงและคุณต้องการแทนที่ให้ใช้รหัสด้านล่าง:
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) ด้วย C # บน. Net Core 3.0 ขึ้นไปตอนนี้มีพารามิเตอร์บูลีนตัวที่สาม:
ดู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 เวอร์ชันอื่น ๆ ทั้งหมดhttps://stackoverflow.com/a/42224803/887092เป็นคำตอบที่ดีที่สุด คัดลอกด้วยการเขียนทับจากนั้นลบไฟล์ต้นฉบับ สิ่งนี้ดีกว่าเพราะมันทำให้เป็นการทำงานของอะตอม (ฉันได้พยายามอัปเดต MS Docs ด้วยสิ่งนี้)
ตามเอกสารสำหรับ File.Moveไม่มีพารามิเตอร์ "เขียนทับถ้ามีอยู่" คุณพยายามระบุโฟลเดอร์ปลายทางแต่คุณต้องระบุข้อมูลจำเพาะของไฟล์ทั้งหมด
การอ่านเอกสารอีกครั้ง ("ให้ตัวเลือกในการระบุชื่อไฟล์ใหม่") ฉันคิดว่าการเพิ่มแบ็กสแลชลงในข้อมูลจำเพาะของโฟลเดอร์ปลายทางอาจใช้งานได้
Move(String, String, Boolean)
แทน แต่ดูเหมือนจะเป็นความผิดพลาด?
ลองMicrosoft.VisualBasic.FileIO.FileSystem.MoveFile(Source, Destination, True)
. พารามิเตอร์สุดท้ายคือสวิตช์เขียนทับซึ่งSystem.IO.File.Move
ไม่มี
หากคุณไม่มีตัวเลือกในการลบไฟล์ที่มีอยู่แล้วในตำแหน่งใหม่ แต่ยังคงต้องย้ายและลบจากตำแหน่งเดิมเคล็ดลับการเปลี่ยนชื่อนี้อาจใช้ได้ผล:
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);
สิ่งนี้ถือว่าเป็นเพียง "." ในชื่อไฟล์อยู่ก่อนนามสกุล มันแยกไฟล์ออกเป็นสองไฟล์ก่อนส่วนขยายแนบ "_copy" ในระหว่าง. วิธีนี้ช่วยให้คุณสามารถย้ายไฟล์ แต่จะสร้างสำเนาหากไฟล์มีอยู่แล้วหรือมีสำเนาของสำเนาอยู่แล้วหรือมีสำเนาของสำเนาอยู่ ... ;)