11

ファイルを削除しようとすると、次の例外が発生します。

別のプロセスで使用されているため、プロセスはファイル '' にアクセスできません。

私のコードは次のようになります:

string[] files = Directory.GetFiles(@"C:\SEDocumentConverter\SOURCE");
foreach (string file in files)
{               
   File.Delete(file);
}

どうすればこの問題を解決できますか?

4

6 に答える 6

9

現在別のプロセスで使用されているファイルを削除する方法はありません。ファイルを削除する前に、そのファイルを開いているプログラムをすべて閉じる必要があります。

どのプログラムかまだわからない場合は、HandleまたはProcess Explorerを使用して把握できます。

于 2011-03-08T12:49:23.793 に答える
4

Windows のMoveFileEx関数を P/Invoke し、MOVEFILE_DELAY_UNTIL_REBOOT フラグを使用して、NULL の宛先名を指定できます。これにより、再起動時にファイルが削除されます。

于 2011-03-08T15:05:49.117 に答える
0

少し話題から外れています:しかし、あなたのコードからは、フォルダーのすべてのファイルを削除しようとしているようです。それらを 1 つずつ削除する代わりに、別のメソッド Directory.Delete(path, True) を使用して、path という名前の文字列に含まれるディレクトリを削除します。その後、必要に応じてディレクトリを再作成できます。しかし、あなたの問題はここでも続くかもしれません。

于 2011-03-08T13:06:44.590 に答える
0

もう 1 つの方法は、開いているファイルのハンドルをすべて見つけて、それらを強制的に閉じることです。

あなたにとってはうまくいきますが、ファイルを使用していたアプリにとっては悪いことです。

SysInternals ProcessExplorer を使用して UI でそれを試すことができます。

于 2013-02-08T19:02:51.563 に答える
0

ファイルが使用されている場合、それを削除しようとしてもうまくいきません。あなたのコードに基づいてどのプロセスがファイルを使用しているのかはわかりませんが、ここ、ここ、ここまたはこの問題に関するガイダンスについては、これに関連して表示されるその他の質問を調べてみてください。 、プロセス エクスプローラーの使用に関する @Cody Gray のガイダンスに必ず従ってください。

于 2011-03-08T12:53:25.177 に答える
-1

このファイルの名前を変更するだけです。これは、その場所に書き込もうとする人のために行われます。

ノート:

1)もちろん、ファイルはまだ物理的に削除されていません。MoveFileEx仕事を完了するためにここで言及されたトリックをするのはいいことです。

2)ロックされたファイルを削除してその場所にsmth newを書き込む場合(ビルド中など)は、ファイルの名前をGUID名に変更するだけです。フォルダをクリーンにする必要がある場合は、無視された拡張子/非表示属性を使用するか、ファイルの名前を下のパスに変更します%TEMP%(同じドライブ上にある場合)。

3)すべてのロックされたファイルの名前を変更できるわけではありませんが、90%の実用的なアプリケーションのように機能します。開いている読み取り/書き込み/実行ハンドルに影響を与えることなくファイルを移動できます。移動したファイルは引き続き適切に機能します(もちろん、同じNTFSボリューム内で移動した場合)。

4)これは、Windowsインストーラーが、すぐに再起動するように要求する前に基本的に行うことです。ファイルを目から離し、再起動時に削除されるようにスケジュールします。通常、新しくインストールしたアプリはすぐに使用できます。

実用:

私のお気に入りはMSBuildです。このようなものでタスクをオーバーライドする<Copy/>と、すべてのビルドがlinux-wayになります。以前のバージョンがまだどこかで実行されているかどうかは気にせず、ビルドして実行できます。古いアプリは古いバージョンのファイルを使い続けます。新しいアプリは、新しく作成されたバージョンをロードします。

同じドライブ上にある場合はに移動する可能性%TEMP%があります(私の場合はそうではありません)。現在のソース管理クライアントでは無視される拡張子に名前を変更するだけです。

于 2013-02-08T18:59:28.417 に答える