4

フォルダーを解析し、その中のすべてのファイルを削除しようとしています。

DirectoryInfo dir = new DirectoryInfo("C\\Temp");
if (dir.GetDirectories().Any(p => p.Name == "\\NewTemp"))
{
    foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
    {
        File.SetAttributes(file, FileAttributes.Normal);
        File.Delete(file);
    }
}

このコードは正常に機能し、\NewTemp フォルダー内のすべてのファイルを削除します。ただし、いずれかのファイルが開かれている場合、それらのファイルは削除されません。開いているファイルを強制的に閉じて削除したい。私も試してみました

foreach (string file in Directory.GetFiles(dir + "\\NewTemp"))
{
    TextReader tr = new StreamReader(dir+"\\NewTemp\\"+file);
    tr.Close();
    File.SetAttributes(file, FileAttributes.Normal);
    File.Delete(file);
}

しかし、役に立たない。私が行方不明になっている場所を教えてください。

4

6 に答える 6

5

私が行方不明になっている場所を教えてください。

ファイルのハンドルを閉じいますが、プロセスが所有しているかどうかに関係なく、他のファイルハンドルには影響しません。基本的に、他の場所で使用されているファイルは、削除を許可するファイル共有フラグで明示的に開かれていない限り、削除できません。私の知る限り、これが Windows ファイル システムの仕組みです。(編集: 私は当初、ファイル ハンドルを開いたままにする方法としてメモ帳を使用することを提案しましたが、メモリにロードした後にハンドルを閉じるようです。ええと、他のアプリを試してください:)

于 2012-10-04T14:40:19.037 に答える
1

ハンドルが別のプロセスによって開かれている場合、ファイルを削除することはできません。ファイルを削除する前に、まずそのプロセスを強制終了する必要があります。

この例を見て、開いているすべてのハンドルを見つける方法を確認できます。

于 2012-10-04T14:43:33.327 に答える
0

これは、どのプロセスにファイルハンドルがあるかを見つけるための便利なツールです。

http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

于 2012-10-04T14:47:26.983 に答える
0

ファイルを開いているプログラムがわかっている場合は、そのプログラムを直接タスクキルしてからファイルを削除できます。

ファイルを開いているプロセスがわからない場合は、このようなユーティリティを使用して、出力を処理できます。私自身、出力をリダイレクトしてから正規表現を使用して取得したいプロセスを見つけますが、おそらくもっと良い方法があります。

この方法は完全に安全というわけではなく、殺したくないプロセスを殺してしまう可能性があることに注意してください。

于 2012-10-04T14:49:33.563 に答える
0

これらは選択肢であり、試すべき順序 (最も侵襲性の低いものから非常に侵襲性の高いものまで) です。

  1. 現在行っていることを実行します (読み取り専用属性を削除し、ファイルを削除してみてください)。
  2. ファイルの名前を変更してから削除してみてください。
  3. それが機能しない場合は、フラグを使用してファイルを開く必要があります( CreateFileFILE_FLAG_DELETE_ON_CLOSEにピンボークします)。ファイルへの他のすべてのハンドルが閉じられると、システムはファイルを削除します。
  4. 上記の CreateFile の呼び出しが、ファイルが で開かれていないために失敗した場合は、MoveFileExをフラグ (および lpNewFileName パラメーターを NULL / IntPtr.Zero に設定)FILE_SHARE_DELETEで呼び出す必要があります。これにより、システムの次回の再起動/再起動時にファイルが削除されます。MOVEFILE_DELAY_UNTIL_REBOOT
  5. ステップ 4 が実用的でない場合 (つまり、再起動を待てない場合) にのみ、ファイルがロックされている可能性のあるランダムなプロセスを強制終了する方法に進む必要があります。特にシステム プロセスを強制終了しようとしている場合は、システムが不安定になる可能性があることに注意してください。
于 2013-12-30T05:11:39.807 に答える
0
foreach (System.Diagnostics.Process myProc in System.Diagnostics.Process.GetProcesses())
{
    if (myProc.ProcessName == "EXCEL")
    {
        myProc.Kill();
        break;
    }
}
于 2018-06-07T11:50:11.137 に答える