Cドライブのフォルダ(ドライブCの場合)から別のフォルダ(ドライブDの場合)にファイルを移動します。ファイルが既にコピー先フォルダに存在する場合は、そのファイルを上書きする必要があります。 C++の標準ライブラリやQtでどうすれば実現できますか?Qt C++:ファイル、ソースパス、および移動先パスが別のドライブに移動しています
"rename"メソッドが見つかりましたが、パスが別のドライブにある場合は動作するかどうかはわかりません。さらに、プラットフォームの依存関係は何ですか?
Cドライブのフォルダ(ドライブCの場合)から別のフォルダ(ドライブDの場合)にファイルを移動します。ファイルが既にコピー先フォルダに存在する場合は、そのファイルを上書きする必要があります。 C++の標準ライブラリやQtでどうすれば実現できますか?Qt C++:ファイル、ソースパス、および移動先パスが別のドライブに移動しています
"rename"メソッドが見つかりましたが、パスが別のドライブにある場合は動作するかどうかはわかりません。さらに、プラットフォームの依存関係は何ですか?
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
はそれをやって、ファイル全体が一度にある新しい場所が表示されますで、そのファイル、および最悪の故障モードは、コピーを伴います移動する代わりにファイル。
Windowsのドライブ文字を考慮すると、[MSDN](http://msdn.microsoft.com/en-us/library/zw5t957f.aspx)に従うことをお勧めします: "新しい名前は、既存のファイルやディレクトリ 'rename'を使って' newname'引数に別のパスを指定することでファイルを一つの[...]デバイスから別のディレクトリに移動できますが、 'rename'を使ってディレクトリを移動することはできません。 " – MSalters
ターゲットディレクトリがマウントされたドライブに座っていれば、好奇心から逃れるだけです。私はそれを確認するためのリソースがありません:(。 –
@nik_kgp少しの研究の後、Windows上のアトミックファイル操作は非常に複雑です(または、特にVista以前のWindows版では不可能です)。 Posixよりも問題はないので、一般的な解決策は気にすることなく、エラーをチェックして適切なものを報告することです。とにかくいつでもアンマウントすることができます(あるいは外付けドライブの場合はケーブルを外してください)。 'QFile :: rename'を使ってリターンコードをチェックしてください。 – hyde
私の答えは機能しますか? :) –
Qt doc says "(bool QFile :: rename(const QString&newName))名前の変更操作が失敗した場合、Qtはこのファイルの内容をnewNameにコピーしてから、このファイルを削除します。私は、ドライブが違うとうまくいくはずだと思います。 – Kunal