web-dev-qa-db-ja.com

一時的な場所に書き込み、それを目的の宛先にコピーする利点は何ですか?

私は衛星画像で動作するアプリケーションを書いていて、上司から商用アプリケーションのいくつかを見て、それらの動作を確認するように依頼されました。奇妙な振る舞いを見つけ、それを探していたところ、他の標準的なアプリケーションでも同様に見つけました。

これらのプログラムは、最初に一時フォルダーに書き込み、次に目的の宛先にコピーします。

例:7Zipは、最初に一時フォルダーに抽出し、次に、抽出したデータを、データを抽出するように要求した場所にコピーします。

このアプローチにはいくつかの問題があります。

  1. 一時フォルダーには十分なスペースがない可能性がありますが、意図した場所にはそれだけのスペースがある可能性があります。

  2. 大きなファイルの場合、コピー操作に無視できない時間がかかる可能性があります。

私はそれについてたくさん考えましたが、これを行うための単一の肯定的な点を見ることができませんでした。私は何かを逃していますか、またはこれを行うことには本当にメリットがありますか?

49

私が考えることができるいくつかの理由:

  • ほとんどのプラットフォームでは、ファイルの移動はアトミックですが、ファイルの書き込みはそうではありません(特に、一度にすべてのデータを書き込むことができない場合)。したがって、一般的なプロデューサー/コンシューマーパターンがある場合(1つのプロセスがファイルを生成し、もう1つはディレクトリを監視して検出されたすべてを取得します)、最初に一時フォルダーに書き込み、次に実際の場所に移動するだけで、コンシューマーは未完成のファイル。
  • ファイルを書き込むプロセスが途中で終了した場合、ディスク上のファイルが壊れています。実際の場所にある場合は、自分でクリーンアップする必要がありますが、一時的な場所にある場合は、OSが処理します。
  • バックアップジョブの実行中にファイルが作成された場合、ジョブは不完全なファイルを取得する可能性があります。一時ディレクトリは通常バックアップから除外されるため、ファイルは最終的な宛先に移動されたときにのみ含まれます。
  • 一時ディレクトリは、高速で揮発性の高いファイルシステム(RAMディスクなど)上にある場合があります。これは、同じファイルの複数のチャンクを並列にダウンロードしたり、シークを多く行ってファイルをインプレース処理したりする場合などに役立ちます。また、一時ディレクトリは、読み取り、書き込み、削除の頻度が少ないディレクトリよりも断片化を引き起こす傾向があり、一時ディレクトリを別のパーティションに保持すると、他のパーティションの断片化を抑えることができます。

TL; DR-それは主に原子性に要約されます。つまり、(最終的な場所で)ファイルがいつでも完全であるか、まったく存在しないようにする必要があります。

96
tdammers

これはWindowsの問題のようです。具体的には、ドラッグドロップの管理方法に関連しています。

[〜#〜] winscp [〜#〜] クライアントの開発者は独自のシェル拡張を開発しました。これにより、このドラッグアンドドロップ動作が上書きされ、ファイルを正しいフォルダーにすぐにドロップできます。彼らは documentation でトリックを説明し、さらに興味深いことに、何が問題で、どのように解決したかを説明します。

ここに興味深い部分があります:

Windowsのドラッグ&ドロップメカニズムでは、ドラッグ&ドロップ操作のソースアプリケーションが、ファイルがドロップされた場所を簡単に見つけることができません。ファイルを宛先に転送するのは、ターゲットアプリケーション(通常はWindowsエクスプローラー)です。ソースアプリケーションはすべての可能な宛先にファイルを転送することができないため、それはかなり合理的です。ディレクトリだけでなく、Zipファイル(またはその他のアーカイブ)、リモートディレクトリ(FTP、SFTP、SCPなどを使用)、ゴミ箱などにもファイルをドロップできることに注意してください。

明らかに、Windowsエクスプローラ(またはWinZipのような他のターゲットアプリケーション)でも、可能なソースからファイルをダウンロードすることはできません(特に、SFTP/SCPを認識していません)。

また、特に7Zipの場合:ユーザーray023がSuperUserスタックQ&Aでこの質問に回答します: https://superuser.com/a/42246

基本的に、ファイルをドラッグアンドドロップする代わりに、bith 7-ZipおよびWinrarで利用可能な「ここで抽出」メソッドを使用する場合、ファイルは適切なディレクトリに直接抽出されます。

15
Jalayn

ファイルに対して何らかのデータ処理(デコード/変換など)を行う必要がある場合は、一時ファイルを使用し、完了したら、完了した場合にのみ、結果を最終的な宛先に転送することをお勧めします。

利点:

  1. 完了したファイルのみが宛先に到達します
  2. 一時ファイルは高速メディアに常駐する必要があります(あるべきです)
  3. 最終ファイルの断片化を回避する
  4. 他のメディアを最終的な宛先として使用できるようにします(ftp、クラウドなど)
  5. 中断された一時ファイルはクリーニングが簡単です

データの処理中に宛先に直接書き込むことの実際の利点はわかりません。

0
roetnig