[c#] 디렉토리 + 하위 디렉토리의 모든 파일 및 디렉토리 나열

디렉토리 및 해당 디렉토리의 하위 디렉토리에 포함 된 모든 파일과 디렉토리를 나열하고 싶습니다. 디렉토리로 C : \를 선택하면 프로그램은 액세스 권한이있는 하드 드라이브에있는 모든 파일과 폴더의 모든 이름을 가져옵니다.

목록은 다음과 같을 수 있습니다.

fd \ 1.txt
fd \ 2.txt
fd \ a \
fd \ b \
fd \ a \ 1.txt
fd \ a \ 2.txt
fd \ a \ a \
fd \ a \ b \
fd \ b \ 1.txt
fd \ b \ 2.txt
fd \ b \ a
fd \ b \ b
fd \ a \ a \ 1.txt
fd \ a \ a \ a \
fd \ a \ b \ 1.txt
fd \ a \ b \ a
fd \ b \ a \ 1.txt
fd \ b \ a \ a \
fd \ b \ b \ 1.txt
fd \ b \ b \ a



답변

string[] allfiles = Directory.GetFiles("path/to/dir", "*.*", SearchOption.AllDirectories);

*.*파일과 일치시킬 패턴은 어디에 있습니까?

디렉토리도 필요하면 다음과 같이 갈 수 있습니다.

 foreach (var file in allfiles){
     FileInfo info = new FileInfo(file);
 // Do something with the Folder or just add them to a list via nameoflist.add();
 }


답변

Directory.GetFileSystemEntries.NET 4.0+에 존재하며 파일과 디렉토리를 모두 반환합니다. 그렇게 부르십시오.

string[] entries = Directory.GetFileSystemEntries(path, "*", SearchOption.AllDirectories);

액세스 권한이없는 하위 디렉터리의 내용을 나열하려는 시도 (UnauthorizedAccessException)에는 대처할 수 없지만 필요에 따라 충분할 수 있습니다.


답변

GetDirectoriesGetFiles메서드를 사용하여 폴더와 파일을 가져옵니다.

를 사용하여 하위 폴더의 폴더와 파일도 가져옵니다.SearchOption AllDirectories


답변

public static void DirectorySearch(string dir)
{
    try
    {
        foreach (string f in Directory.GetFiles(dir))
        {
            Console.WriteLine(Path.GetFileName(f));
        }
        foreach (string d in Directory.GetDirectories(dir))
        {
            Console.WriteLine(Path.GetFileName(d));
            DirectorySearch(d);
        }
    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}


답변

GetFiles방법은 파일 목록을 반환하지만 디렉토리는 반환하지 않습니다. 질문의 목록은 결과에 폴더도 포함되어야한다는 메시지를 표시합니다. 더 많은 사용자 정의 목록을 원하면 호출 GetFilesGetDirectories재귀 적으로 시도 할 수 있습니다 . 이 시도:

List<string> AllFiles = new List<string>();
void ParsePath(string path)
{
    string[] SubDirs = Directory.GetDirectories(path);
    AllFiles.AddRange(SubDirs);
    AllFiles.AddRange(Directory.GetFiles(path));
    foreach (string subdir in SubDirs)
        ParsePath(subdir);
}

팁 : 특정 속성을 확인해야하는 경우 FileInfoDirectoryInfo클래스를 사용할 수 있습니다 .


답변

핸들을 반환하는 FindFirstFile을 사용하고 FindNextFile을 호출하는 함수를 재귀 적으로 계산할 수 있습니다. 참조 된 구조가 alternativeName, lastTmeCreated, modified, attributes 등과 같은 다양한 데이터로 채워지기 때문에 이것은 좋은 접근입니다.

그러나 .net 프레임 워크를 사용하면 관리되지 않는 영역으로 들어가야합니다.


답변

최대 lvl이 디렉토리에 내려 가고 폴더를 제외하는 옵션이있는 일부 개선 된 버전 :

using System;
using System.IO;

class MainClass {
  public static void Main (string[] args) {

    var dir = @"C:\directory\to\print";
    PrintDirectoryTree(dir, 2, new string[] {"folder3"});
  }


  public static void PrintDirectoryTree(string directory, int lvl, string[] excludedFolders = null, string lvlSeperator = "")
  {
    excludedFolders = excludedFolders ?? new string[0];

    foreach (string f in Directory.GetFiles(directory))
    {
        Console.WriteLine(lvlSeperator+Path.GetFileName(f));
    }

    foreach (string d in Directory.GetDirectories(directory))
    {
        Console.WriteLine(lvlSeperator + "-" + Path.GetFileName(d));

        if(lvl > 0 && Array.IndexOf(excludedFolders, Path.GetFileName(d)) < 0)
        {
          PrintDirectoryTree(d, lvl-1, excludedFolders, lvlSeperator+"  ");
        }
    }
  }
}

입력 디렉토리 :

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
      file6.txt
  -folder3
    file3.txt
  -folder4
    file4.txt
    file5.txt

함수 출력 (폴더 5의 내용은 lvl 제한으로 인해 제외되고 folder3의 내용은 excludedFolders 배열에 있으므로 제외됨) :

-folder1
  file1.txt
  -folder2
    file2.txt
    -folder5
  -folder3
  -folder4
    file4.txt
    file5.txt