1

アプリケーションがファイルを保存する場合、一般的なモデルでは、ファイルを一時的な場所に保存してから、一時ファイルを最終的な場所に移動します。「移動」が「置換」になる場合もあります。擬似コード:

Save temp file;
if final file exists
   delete final file;
move temp file to final filename;

そこには削除が成功する可能性のあるウィンドウがありますが、移動は成功しない可能性があるため、次のような方法で処理できます。

Save temp file;
if final file exists
   move final file to parking lot
move temp file to final filename;
if move succeeded       
   delete previous final file. 
else
   restore previous final file. 

今私の質問に:

  1. 一時ファイルを最終ディレクトリに保存するのではなく、一時ファイルを一時ディレクトリに保存してから移動することをお勧めしますか? (もしそうなら、なぜですか?)

  2. 最初に一時ディレクトリに保存され、次に別のディレクトリの最終ファイルに移動されたファイルと、最終ディレクトリの一時ファイルに保存されたファイルの属性と権限に違いはありますか?ディレクトリ内で名前が変更されましたか?

  3. 両方の答えが YES の場合、最初に一時ディレクトリに保存され、次に最終ディレクトリに移動されたファイルに適切な ACL を取得しながら、どのように優先することができますか?

4

9 に答える 9

1
  1. GetTempFile ルーチンを使用して一時ファイルを作成することをお勧めします。これにより、事前定義された場所 (C:\temp など) に一時ファイルが作成され、アプリがクラッシュしたり破損したファイルが作成されたりした場合にユーティリティによって削除される可能性があります。最終ディレクトリで同じことが発生した場合、回復不能です。

  2. はい、ターゲット ファイルの属性または ACL が編集されている場合、属性が異なる可能性があります。これは、同じフォルダーに一時ファイルを作成した場合でも発生する可能性があります。

  3. これを修正するには、File.Replace ルーチンを使用します。このルーチンは、あるファイルを別のファイルにアトミックに置換し、新しいファイルの属性と ACL を古いファイルのものに置き換えます。

これを行う AC# メソッドは、ファイルのセーフ ストリーム更新に対する回答です。

于 2009-07-15T03:27:37.140 に答える
1

これらが永続ファイルに変わる一時ファイルである場合は、同じ場所に作成して、ディスク/パーティション間でファイルを「移動」するリスクを回避します。これにより、より多くの I/O が発生します (コピーの後に削除が続くため)。 .

これらが本当に一時的な一時ファイルである場合は、一時ディレクトリに作成 (およびそのまま) します。

于 2009-07-15T03:11:45.283 に答える
1

ファイルをあるディレクトリに書き込んで別のディレクトリに移動したくない理由は、それらのディレクトリが異なるファイルシステム上にある可能性があるためです。Windows ではあまり問題になりませんが、親ファイルシステムが ntfs である限り、問題になる可能性は十分にあります。UNIX では、/tmp を別のファイルシステムにするのが標準的な方法です。

これが問題になる理由は、ファイルをある場所から別の場所にコピーする必要があるためです。これは、かなりのサイズのファイルのパフォーマンスに大きな影響を与え、ファイルが小さい場合でも、より多くのシークが必要になることは間違いありません。さらに、ファイルシステムの境界を越えてファイルを移動するときにこれが失敗する方法は他にもたくさんあります。もちろん、アクセス許可は異なる可能性がありますが、ターゲットファイルシステムがいっぱいである可能性や、後で延期するその他の複雑な問題が多数発生する可能性もあります。

于 2009-07-15T03:34:21.010 に答える
1

Microsoft Word は、チルダ (~) で始まる元のディレクトリに一時ファイルを保存します。私はその慣習に従うだけです。

于 2009-07-15T00:26:09.653 に答える
1

一時ファイルのみの場合は、一時フォルダーに一時ファイルを作成します。それ以外の場合は、最終的な宛先に作成します。

警告:

1) 最終的な宛先が「ピックアップ」フォルダの場合、これは機能しない可能性があります (「ピックアップ」プロセスがロックされたファイルをチェックしない限り (チェックする必要があります))。

2) 最終的な宛先には、最終的な宛先に移動する前に、コードで作成して適用する必要がある特別なアクセス許可があります。

于 2009-07-15T00:27:01.933 に答える
0

デフォルトでは、File.createTempFile() でサフィックス パラメータが null に設定されている場合、Android はサフィックスとして .tmp を配置します。それを使用することをお勧めします。

File file = File.createTempFile(imageFileName, null, storageDir);

アプリで .tmp ファイルを使い終わったらすぐに、自分で file.delete() を呼び出す必要があります。file.deleteOnExit() に依存するべきではありません。Android システム/VM によって使用されるという保証はまったくないからです。

于 2012-05-16T13:17:05.560 に答える
0

一時ファイルを最終ディレクトリに保存することをお勧めします。

  1. あなたが説明した潜在的な許可の問題を回避します。

  2. 最終ディレクトリは別のボリュームにある可能性があります。その場合、(一時ファイルから最終ファイルへの) 移動は、実際にはコピー + 削除になります。頻繁に行う場合やファイルが大きい場合は、多くのオーバーヘッドが発生します。

既存のファイルの名前をいつでも 2 番目の一時ファイルに変更し、新しい一時ファイルの名前を既存のファイルの名前に変更し、エラー時にロールバックすることができます。それが最も安全な組み合わせのように思えます。

EDITED:あなたの「駐車場」はすでに私の提案を説明しているので、ここに多くを追加したかどうかはわかりません.

于 2009-07-15T00:26:03.833 に答える
-1

ユーザーが構成可能にしないのはなぜですか? 一部のユーザーは、現在のディレクトリを汚染する一時ファイルを好まないことがあります。

于 2009-07-15T00:49:38.210 に答える