2013-08-26 41 views
8

我想用C++將一個文件從一個文件夾(比如驅動器C)移動到另一個文件夾(比如驅動器D)。如果該文件已存在於目標文件夾中,則應覆蓋該文件。我如何用C++ std庫或Qt實現它?Qt C++:移動文件,源和目標路徑在不同的驅動器上

我發現「重命名」的方法,但我不確定它會工作,如果路徑在不同的驅動器上。而且,什麼是平臺依賴?

+0

我的回答是否有效? :) –

+0

Qt doc說:「(bool QFile :: rename(const QString&newName))如果重命名操作失敗,Qt將嘗試將此文件的內容複製到newName,然後刪除此文件,只保留newName。」,so我認爲如果硬盤不同,它應該可以工作。 – Kunal

回答

5

只需使用QFile::rename()。對於大多數目的而言,它應該做大致正確的事情。 C++標準庫沒有跨文件系統重命名調用,我認爲(如果我錯了,請在評論中糾正我),std::rename只能在單個文件系統中移動。

但是,通常這裏唯一的(相關的)原子文件操作是在同一文件系統中重命名的,文件內容未被觸摸,只有目錄信息發生變化。我不知道它支持這一個C++庫,所以這裏的粗糙的僞代碼:

if basic rename succeeds 
    you're done 
else if not moving between file systems (or just folders for simplicity) 
    rename failed 
else 
    try 
    create temporary file name on target file system using a proper system call 
    copy contents of the file to the temporary file 
    rename temporary file to new name, possibly overwriting old file 
    remove original file 
    catch error 
    remove temporary file if it exists 
    rename failed 

做它像這樣保證了,在新的位置會出現該文件是整個文件一次,最失敗的模式包括複製該文件而不是移動。

+1

考慮到Windows驅動器號,推遲到[MSDN](http://msdn.microsoft.com/en-us/library/zw5t957f.aspx)可能是明智之舉:「新名稱不能是現有的文件或目錄,您可以使用'rename'通過在'newname'參數中給出不同的路徑將文件從一個設備移動到另一個設備,但是,您不能使用'rename'來移動一個目錄。 「 – MSalters

+0

出於好奇,如果目標目錄位於安裝的驅動器上,它會工作嗎?我沒有資源來驗證它:(。 –

+0

@nik_kgp經過一些研究後,它看起來像Windows上的原子文件操作相當複雜(或者不可能,特別是在Vista之前的Windows版本中)主題,更是如此所以一般的解決方案是不用擔心它,只是檢查錯誤並報告適當的依賴於確切的文件系統狀態是一個壞主意,因爲一些其他程序可能會同時修改它關於安裝的驅動器,無論如何用戶可以隨時卸載它(或者在外部驅動的情況下,只需拔出電纜),因此只需使用'QFile :: rename'並檢查返回代碼。 – hyde

相關問題