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


48

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

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

例:7zipはまずtempフォルダーに抽出し、次にデータを抽出するように要求した場所に抽出したデータをコピーします。

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

  1. 一時フォルダーには十分なスペースがない場合がありますが、目的の場所にはそのようなスペースがある場合があります。

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

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


アプリケーションで必要な場合は、実行してください。そうでなければ、意味のあることをしてください。あなたの脳は、この場合には必要ないことを伝えています。私の答えでわかるように、私は可能な限り最小限の作業を行うキャンプにいるので、アプリで可能な限り最小限の作業を行うことをお勧めします。
ジェイソンセブリング

1
ファイルを「移動」するのではなく、ファイルを「コピーする」のですか?大きな違い。
フランク

blogs.rsa.com/…から、マルウェアの利点は、1) ユーザーのコンピューターにウイルスを完全にダウンロードする前に、保証された書き込み可能性が「レッドエラー」の検出を回避することです。2) TEMPディスクは通常ウイルスがまだダウンロード段階にある間に検出(ウイルスが完全に形成され、0.05秒間実行されるとゲームオーバーになるため、時間のレースになります)
-Pacerier

3)まだダウンロードまたは実行中に、ウイルス対策ソフトが(時々自分自身を知らずに)破壊し、骨が横になったままになった場合でも、OSまたはユーザーが誤って削除を手助けする可能性がx%ある可能性がありますTEMPフォルダーから大量のデータを消去している間、死んだ骨は検出確率を下げるのに役立ちます。
パセリエ

回答:


96

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

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

TL; DR-ほとんどの場合、原子性に要約されます。つまり、(最終的な場所で)ファイルが完全になるか、常に存在しないようにする必要があります。


12
一時ディレクトリが別のパーティションにある場合、原子性が失われます。
イフェルドブルム

16
一部のプログラムは、目的のディレクトリに抽出/コピーしますが、一時ファイル拡張子(.tmpなど)を使用し、完了時に名前を変更します。
ダン・ディプロ

5
一時ファイルへの書き込みは、プログラムの複数のインスタンスが同時に同じファイルをアップロードしようとし、適切なロックレベル(不十分に定義されたクラウドストレージAPIなど)を提供するためにファイルシステムに依存できない場合にも役立ちます。一時ファイルを使用すると、結果のファイルが両方のアップロードのデータが混在することはありません。もちろん、これは原子性の別のインスタンスにすぎません。
クシシュトフコジエルチク

1
Dan Diploのケースは、既存のファイルを更新するときに役立ちます。新しいものが正常に書き込まれるまで、新しいものの書き込みが失敗するか、完全に書き込まれる前に新しいものが他の何かを読むまで、古いものを置き換えたくないでしょう。
ラルフシャピン

1
残念ながら、OS Tempフォルダは古いファイルやフォルダでいっぱいになっていますが、これはOSがクリーンアップしないためです!したがって、開発者としてはまだクリーンアップする必要があります!superuser.com/questions/296824/...
markmnl

15

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

開発者のWinSCPクライアントは、このドラッグアンドドロップの動作をオーバーライドして、すぐに右のフォルダにファイルをドロップすることができ、独自のシェル拡張を開発しました。彼らはドキュメントでトリックを説明し、さらに興味深いことに、問題は何であり、どのように解決したかを説明します。

興味深い部分は次のとおりです。

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

明らかに、Windows Explorer(またはWinZipなどの他のターゲットアプリケーション)でさえ、可能なソースからファイルをダウンロードできません(特にSFTP / SCPを認識しません)。

また、特に7zipをのために:ユーザーray023はスーパーユーザスタックQ&Aで、この質問に答えるhttps://superuser.com/a/422463を

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


2
質問は「7zipが一時ファイルを使用する理由」ではありませんでした。実際の質問は、「ソフトウェア開発で一時ファイルがよく使われるのはなぜですか」でした。
フィル

@Phil与えられた例は、私が理解していることから、明示的に「抽出する」ことを要求せずに、1つのファイルをアーカイブからシステム上のフォルダーにドラッグすると何が起こるかです。しかし、私は質問を再読み込み、およびはい、私はあなたが正しいことに著者は仕方によってmasterfuly(+1はあまりにも私が投票)tdammersで答えた一時的なフォルダの有用性についてもっと知りたいと思っていると思います
ジャレイン

あなたの答えは正確に私が探していたものではありませんでしたが、7zipで私の問題を解決するために+1
Devdatta Tengshe

1
良いコメントは基本的に次のように要約されます:なぜプログラムは一時フォルダーを使用するのですか?ドラッグアンドドロップするとき、宛先フォルダがわからず、ウィンドウに「与える」だけなので、ウィンドウがファイルを引き継いで適切な場所に置くからです。
ピーターB

0

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

利点:

  1. 完了したファイルのみが宛先に到達します
  2. 一時ファイルは高速メディアに常駐する可能性があります
  3. 最終ファイルの断片化を回避
  4. 最終宛先として他のメディアの使用を許可します(ftp、クラウドなど)
  5. 中断された一時ファイルはきれいになりやすい

データの処理中に宛先に直接書き込むことの本当の利点はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.