39

私のアプリでは、ユーザーが画像ギャラリーを作成できるシステムを構築しました。ディスク上の category_name/gallery_name/{pictures} の形式のフォルダーに保持されている写真。アップロードされた各写真は、上記の関連するディレクトリ構造に保存されます。

ただし、カテゴリを削除しようとすると、データベースから削除するだけでなく、関連するフォルダーもシステムから削除したいと思います。「ディレクトリが空ではありません」というエラーメッセージを最初に受け取ったとき、検索して次の解決策を見つけました。

public static void DeleteDirectory(string target_dir)
    {
        string[] files = Directory.GetFiles(target_dir);
        string[] dirs = Directory.GetDirectories(target_dir);

        foreach (string file in files)
        {
            File.SetAttributes(file, FileAttributes.Normal);
            File.Delete(file);
        }

        foreach (string dir in dirs)
        {
            DeleteDirectory(dir);
        }

        Directory.Delete(target_dir, false);
    }

このソリューションでは、「gallery_name」フォルダー内の写真が正常に削除され、その後、gallery_name フォルダー自体が正常に削除されるため、空の category_name フォルダーが残ります。次に、上記のサブルーチン ( Directory.Delete(target_dir, false);) の最後のコードが呼び出され、category_name フォルダーが削除されます。エラーが再び発生します..

誰もこれに対する解決策を知っていますか?

  1. Directory.Delete(target_dir, true);うまくいかなかったので、別の方法を試しました。
  2. 親フォルダーを完全に制御でき、category_name フォルダーと gallery_name フォルダーもプログラムで問題なく作成されます。
  3. 前述したように、サブ ディレクトリ (gallery_name フォルダー) とその内容 (写真) は、このコードで問題なく削除されます。このコードの後、それは単なる空のフォルダーですが、エラーを引き起こすのは category_name フォルダーです。

私が受け取る例外メッセージは次のとおりです。

System.IO.IOException was unhandled by user code
  HResult=-2147024751
  Message=The directory is not empty.

  Source=mscorlib
  StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive, Boolean throwOnTopLevelDirectoryNotFound)
       at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive, Boolean checkHost)
       at System.IO.Directory.Delete(String path)
       at MyApp.PhotoGallery.Categories.deleteCategory(Int32 cID, String categoryname) in d:\Documents\My Dropbox\web projects\MyAppFolder\App_Code\BLL\PhotoGallery.vb:line 291
       at _admhades_PhotoGallery.deleteCategory(Int32 categoryID, String categoryname) in d:\Documents\My Dropbox\web projects\HavadisPre\_admhades\PhotoGallery.aspx.vb:line 71
4

5 に答える 5

44

Directory.Delete(target_dir, true);ディレクトリとすべてのファイルを再帰的に削除するために使用できます。カスタム関数を記述する必要はありません。

于 2012-09-13T21:38:09.833 に答える
11

これは私が望むほど完全ではありませんが、これらは過去に同様の問題に直面したときに私を助けてくれたものです.

ファイルは他の何かによって使用されています。これは、フォルダー/ファイルを作成し、まだリリースしていないことを意味します。.Close() を使用します (該当する場合)。

ロック関連の問題。

Directory.Delete(rootFolder, true)指定されたルート フォルダー内にフォルダーがない場合に (true は再帰的に削除することを意味します)を使用しました。

別のプログラムによって開かれています。さて、プロセスモニターをインストールする以外にどこから始めればよいかわかりませんが、これは役立つ場合がありますが、実際には特定の状況でのみ機能します。

Anti Virus のようなもの、または (Windows では) Defender のようなものが過去にこの問題を引き起こしました。

Directory.Delete を呼び出して、ファイルがそのような方法で開かれている場合、Directory.Delete はすべてのファイルの削除に成功しますが、Directory.Delete が RemoveDirectory を呼び出すと、「ディレクトリが空ではありません」という例外がスローされます。実際に削除。

明らかなことには、フォルダーを削除する権限があることを確認することが含まれます(あなただけでなく、プログラムが実行されているアカウント)。

削除しようとしているファイルは読み取り専用です。まず、フォルダー内のすべてのファイルのファイル属性を読み取り専用から変更します。

パスは他の Windows コンポーネントによって共有されるため、フォルダーを作成/削除する場所に注意してください。

ソース
ソース

于 2013-02-19T09:00:29.000 に答える