1

W7マシンのc:\ Users\UserNameディレクトリにあるすべてのフォルダのリストを取得しようとしています。

私が使用するとき、Directory.GetDirectories()またはDirectory.GetFiles()「パスへのアクセスが拒否された」という例外が頻繁に発生するという問題があります。管理者モードでVSを実行しましたが、うまくいきませんでした。私のC#で説明されている理由-すべてのファイルにアクセスできない

サブフォルダーの深さがN(つまり、サブフォルダーの数が不明)である可能性があるすべてのサブフォルダーの名前(フォルダー内にファイルがあるかどうかに関係なく)を取得し、それらをリストとして保存する方法を知りたいです。このように、foreachループを介して、特定のロジックに対してフォルダーごとにチェックし、アクセス権があり、アクセスが必要であることを確認できます。

次のコードは、1レベルの深さのみを調べます。

 private List<string> GetAllFolders()
 {
     DirectoryInfo directoryInfo = new DirectoryInfo(this.sourceFolder);
     List<string> allFolders = new List<string>();

     foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories())
     {
         //logic
         allFolders.Add(subDirectoryInfo.FullName);
     }
     return allFolders;
 }

これに使用できるパターンはありますか、またはどのように進めるかについての例や提案がありますか?

4

3 に答える 3

3

もうすぐです。

private List<string> GetAllFolders()
{
    DirectoryInfo directoryInfo = new DirectoryInfo(this.sourceFolder);
    List<string> allFolders = new List<string>();

    foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories(("*.*", SearchOption.AllDirectories))
    {
        //logic
        allFolders.Add(subDirectoryInfo.FullName);
    }
    return allFolders;
}

アクセス権に関しては、すべてのフォルダの最後にアクセスできない場合がありますが、それは特定の特別なフォルダで発生すると思います。これは、何らかの方法で自分で処理する必要があります。それ以外の場合、これは正常に機能します。

さらにこれを参照してください:フォルダとサブフォルダを反復するための最良の方法

于 2012-10-28T13:24:42.287 に答える
1

このコードは実行しませんでしたが、フォルダーを再帰的に繰り返す必要があります。'キャッチアンドコンティニュー'を除いて、例外処理を追加しませんでした

private List<string> GetAllFolders()
{
   var allFolders = new List<string>();
   return GetAllFolders(this.sourceFolder);  
}

// recursively list all folders, catch and continue in case of errors
private List<string> GetAllFolders(string folder)
{
     DirectoryInfo directoryInfo = new DirectoryInfo(folder);
     List<string> allFolders = new List<string>();

     foreach (DirectoryInfo subDirectoryInfo in directoryInfo.GetDirectories())
     {
          //logic
         try {
           allFolders.Add(subDirectoryInfo.FullName);
          allFolders.AddRange(GetAllFolders(subDirectoryInfo.FullName));
        }
        catch (Exception exp)
        {
          // log rrors
          Debug.WriteLine(" exception for " + 
                              subDirectoryInfo.FullName + " : " + 
                            exp.Message);
                } 
            }
            return allFolders;
        }
于 2012-10-28T13:25:27.487 に答える
1
public void GetFolderList()
{
    var list = new List<string>();
    var root = new DirectoryInfo("c:\\");
    GetFoldersRecursive(root, list);
}

private static void GetFoldersRecursive(DirectoryInfo root, List<string> list)
{
    DirectoryInfo[] children;
    try
    {
        list.Add(root.FullName);
        children = root.GetDirectories();
    }
    catch(UnauthorizedAccessException t)
    {
        // access denied
        return;
    }

    foreach (var d in children)
        GetFoldersRecursive(d, list);
}

(例外をキャッチするよりも)より高度なパーミッションチェックを使用したい場合は、ここを参照することをお勧めします

于 2012-10-28T13:32:17.620 に答える