2013-08-26 3 views
8

Cドライブのフォルダ(ドライブCの場合)から別のフォルダ(ドライブDの場合)にファイルを移動します。ファイルが既にコピー先フォルダに存在する場合は、そのファイルを上書きする必要があります。 C++の標準ライブラリやQtでどうすれば実現できますか?Qt C++:ファイル、ソースパス、および移動先パスが別のドライブに移動しています

"rename"メソッドが見つかりましたが、パスが別のドライブにある場合は動作するかどうかはわかりません。さらに、プラットフォームの依存関係は何ですか?

+0

私の答えは機能しますか? :) –

+0

Qt doc says "(bool QFile :: rename(const QString&newName))名前の変更操作が失敗した場合、Qtはこのファイルの内容をnewNameにコピーしてから、このファイルを削除します。私は、ドライブが違うとうまくいくはずだと思います。 – 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版では不可能です)。 Posixよりも問題はないので、一般的な解決策は気にすることなく、エラーをチェックして適切なものを報告することです。とにかくいつでもアンマウントすることができます(あるいは外付けドライブの場合はケーブルを外してください)。 'QFile :: rename'を使ってリターンコードをチェックしてください。 – hyde

関連する問題