8

私のコンソール アプリケーション プログラムは、動作中にいくつかのランタイム ファイルを作成しているため、アプリケーションの起動時にこれらのファイルをすべて削除したいと考えています。私はこれを試しました:

public static void Empty(string targetDir)
{
    var directory = new DirectoryInfo(targetDir);
    if (!directory.Exists) return;
    foreach (var file in directory.GetFiles()) file.Delete();
    foreach (var subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
}

...指定されたパス(プログラム実行パスのサブディレクトリにある)ですべてのファイル/フォルダーを探してから、それらを削除します。ただし、次の例外が発生します。

パス「ファイル」へのアクセスが拒否されました。

管理者としてプログラムを実行しようとしましたが、うまくいきませんでした。ただし、管理者権限を使用せずに機能するソリューションが必要です。

ノート :

  1. ファイルは別のアプリケーションで実行されていません。
  2. ファイルは保護されたフォルダーにありません。
  3. ファイルは問題なく手動で削除できます。それが私がここにいる理由です。
4

5 に答える 5

4

ファイルは別のアプリケーションで開かれていないと言いますが、アプリケーション内で開いている必要があります。

//Create some directories to delete
Directory.CreateDirectory("C:/Temp/DeleteMe");
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe");
File.Create("C:/Temp/DeleteMe/DeleteMeFile");//FileStream still open!!

//Delete the files
var directory = new DirectoryInfo("C:/Temp/DeleteMe");
if (!directory.Exists) return;
foreach (FileInfo file in directory.GetFiles())
{
    file.Delete();
}
foreach (DirectoryInfo dir in directory.GetDirectories())
{
    dir.Delete(true);
}

ファイルを作成するときは、必ずファイル ストリームを破棄してください。

//Create some directories to delete
Directory.CreateDirectory("C:/Temp/DeleteMe");
Directory.CreateDirectory("C:/Temp/DeleteMe/DeleteMe");
using (File.Create("C:/Temp/DeleteMe/DeleteMeFile")) { }

//Delete the files
var directory = new DirectoryInfo("C:/Temp/DeleteMe");
if (!directory.Exists) return;
foreach (FileInfo file in directory.GetFiles())
{
    file.Delete();
}
foreach (DirectoryInfo dir in directory.GetDirectories())
{
    dir.Delete(true);
}
于 2013-03-07T00:36:21.370 に答える
2

Windows API MoveFileEx を使用すると、パラメーター MOVEFILE_DELAY_UNTIL_REBOOT を使用して、再起動後にのみファイルを削除することが解決策になる可能性があります。

http://msdn.microsoft.com/en-us/library/aa365240%28v=vs.85%29.aspxを確認してください。

于 2013-03-06T23:31:43.103 に答える
1

Microsoft.VisualBasic.FileIO.FileSystem便利なメソッドがあるので、メソッドを使ってみてくださいDeleteDirectory。少し前にアクセスに問題がありましたが、これで問題が解決しました。

var directory = new DirectoryInfo(targetDir);
if (directory.Exists)
{
    Microsoft.VisualBasic.FileIO.FileSystem.DeleteDirectory(targetDir, Microsoft.VisualBasic.FileIO.DeleteDirectoryOption.DeleteAllContents);
}
于 2013-03-06T23:49:42.793 に答える