File.renameTo()
ดูเหมือนว่าJava จะมีปัญหาโดยเฉพาะใน Windows ตามที่เอกสาร API ระบุว่า
ลักษณะการทำงานหลายประการของวิธีนี้ขึ้นอยู่กับแพลตฟอร์มโดยเนื้อแท้: การดำเนินการเปลี่ยนชื่ออาจไม่สามารถย้ายไฟล์จากระบบไฟล์หนึ่งไปยังอีกระบบหนึ่งอาจไม่ใช่ atomic และอาจไม่สำเร็จหากไฟล์ที่มีชื่อพา ธ นามธรรมปลายทาง มีอยู่แล้ว. ควรตรวจสอบค่าส่งคืนเสมอเพื่อให้แน่ใจว่าการดำเนินการเปลี่ยนชื่อสำเร็จ
ในกรณีของฉันเป็นส่วนหนึ่งของขั้นตอนการอัพเกรดฉันจำเป็นต้องย้าย (เปลี่ยนชื่อ) ไดเร็กทอรีที่อาจมีข้อมูลกิกะไบต์ (ไดเร็กทอรีย่อยจำนวนมากและไฟล์ที่มีขนาดแตกต่างกัน) การย้ายจะกระทำภายในพาร์ติชัน / ไดรฟ์เดียวกันเสมอดังนั้นจึงไม่จำเป็นต้องย้ายไฟล์ทั้งหมดบนดิสก์จริงๆ
มีไม่ควรจะล็อคไฟล์ใด ๆ กับเนื้อหาของ dir ที่จะย้าย แต่ยังคงค่อนข้างบ่อย renameTo () ล้มเหลวในการดำเนินงานและผลตอบแทนที่เป็นเท็จ (ฉันแค่คาดเดาว่าการล็อกไฟล์บางไฟล์อาจหมดอายุใน Windows โดยพลการ)
ขณะนี้ฉันมีวิธีทางเลือกที่ใช้การคัดลอกและลบ แต่นี้ครับเพราะมันอาจจะใช้เวลามากของเวลาขึ้นอยู่กับขนาดของโฟลเดอร์ ฉันยังพิจารณาเพียงแค่บันทึกข้อเท็จจริงที่ว่าผู้ใช้สามารถย้ายโฟลเดอร์ด้วยตนเองเพื่อหลีกเลี่ยงการรอเป็นเวลาหลายชั่วโมง แต่ทางที่ถูกต้องจะเป็นสิ่งที่อัตโนมัติและรวดเร็ว
ดังนั้นคำถามของฉันคือคุณรู้วิธีการอื่นที่เชื่อถือได้ในการย้าย / เปลี่ยนชื่ออย่างรวดเร็วด้วย Java บน Windowsไม่ว่าจะด้วย JDK ธรรมดาหรือไลบรารีภายนอก หรือถ้าคุณรู้วิธีง่ายๆในการตรวจจับและปลดล็อกไฟล์สำหรับโฟลเดอร์ที่กำหนดและเนื้อหาทั้งหมด (อาจเป็นหลายพันไฟล์) ก็ใช้ได้เช่นกัน
แก้ไข : ในกรณีนี้ดูเหมือนว่าเราจะเลิกใช้เพียงแค่renameTo()
คำนึงถึงสิ่งต่างๆอีกเล็กน้อย ดูคำตอบนี้