C #의 디렉토리에있는 모든 파일을 재귀 적으로 나열하는 방법은 무엇입니까?


315

C #에서 디렉토리 및 하위 디렉토리의 모든 파일을 재귀 적으로 나열하는 방법은 무엇입니까?


1
어디에 채우고 싶습니까? 나무 경우 ... 여기 예제입니다 dreamincode.net/code/snippet2591.htm
아르센 Mkrtchyan

77
문자열 [] 파일 이름 = Directory.GetFiles (경로, "*", SearchOption.AllDirectories)
Bruce

TreeView에서 디렉토리 구조를 렌더링하기 위해 재귀를 사용하는 코드 샘플을 제시 한이 질문 을 볼 수 있습니다 . 대부분의 경우 논리가 동일해야합니다.
Cerebrus

5
이것의 문제점은 단일 디렉토리에 액세스 할 수없는 경우 매우 쉽게 중단된다는 것입니다. 결과가 없습니다 ...
Marc Gravell

1
일부 파일에 액세스 할 수 없을 때 문제가 발생하면 예외를 던지는 파일 열거
CodesInChaos

답변:


186

이 기사 는 필요한 모든 것을 다룹니다. 파일 검색 및 이름 비교와 달리 이름을 인쇄하십시오.

다음과 같이 수정할 수 있습니다.

static void DirSearch(string sDir)
{
    try
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                Console.WriteLine(f);
            }
            DirSearch(d);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

추가 한 barlop

GONeale은 위의 내용은 현재 디렉토리의 파일을 나열하지 않으며 디렉토리를 가져 오는 부분 외부에 파일 목록 부분을 배치하도록 제안합니다. 다음은 그렇게 할 것입니다. 또한 주석 처리를 취소 할 수있는 Writeline 줄도 포함되어 있습니다.이 줄은 재귀의 현재 위치를 추적하여 재귀 작동 방식을 보여주는 호출을 표시하는 데 도움이 될 수 있습니다.

            DirSearch_ex3("c:\\aaa");
            static void DirSearch_ex3(string sDir)
            {
                //Console.WriteLine("DirSearch..(" + sDir + ")");
                try
                {
                    Console.WriteLine(sDir);

                    foreach (string f in Directory.GetFiles(sDir))
                    {
                        Console.WriteLine(f);
                    }

                    foreach (string d in Directory.GetDirectories(sDir))
                    {
                        DirSearch_ex3(d);
                    }
                }
                catch (System.Exception excpt)
                {
                    Console.WriteLine(excpt.Message);
                }
            }

86
이 방법은 초기 디렉토리에 대한 파일을 나열하지 않으며 하위 디렉토리 만 있습니다. GetDirectories 외부로 GetFiles를 이동합니다
GONeale

1
때로는 초기 디렉토리의 파일을 원하지 않는 경우가 있습니다.이 경우 합리적으로 작은 구조에 적합합니다. 매우 큰 목록의 경우 Marc Gravell의 솔루션과 같은 것을 사용하십시오. stackoverflow.com/a/929418/91189
Joseph Gabriel

2
@GONeale이 맞습니다. 사용자가 입력 루트 디렉토리의 파일 목록을 기대하지 않는 것은 그다지 적합하지 않습니다. 단어 입력이 핵심입니다. 이유가 입력되었습니다.
Florin Mircea

2
내부 foreach 루프 주위에 try catch를 추가해야했습니다. 그렇지 않으면 액세스 거부 오류가 계속 발생하지 않습니다.
Shaun Vermaak

3
예외 잡기를 피해야합니다. 예를 들어 OutOfMemoryException을 실제로 잡으시겠습니까? 처리 할 수있는 것만 잡으십시오.
alastairtree

435

.NET 4.0에는 배열 기반이 아닌 반복자 기반 파일 기능이 내장되어 있습니다.

foreach (string file in Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories))
{
    Console.WriteLine(file);
}

현재 나는 다음과 같은 것을 사용할 것입니다. 단일 하위 디렉토리에 액세스 할 수 없으면 내장 재귀 메소드가 너무 쉽게 끊어집니다. Queue<string>사용은 너무 많이 호출 스택 재귀를 방지하고, 반복자 블록은 우리가 거대한 배열을 가진 방지 할 수 있습니다.

static void Main() {
    foreach (string file in GetFiles(SOME_PATH)) {
        Console.WriteLine(file);
    }
}

static IEnumerable<string> GetFiles(string path) {
    Queue<string> queue = new Queue<string>();
    queue.Enqueue(path);
    while (queue.Count > 0) {
        path = queue.Dequeue();
        try {
            foreach (string subDir in Directory.GetDirectories(path)) {
                queue.Enqueue(subDir);
            }
        }
        catch(Exception ex) {
            Console.Error.WriteLine(ex);
        }
        string[] files = null;
        try {
            files = Directory.GetFiles(path);
        }
        catch (Exception ex) {
            Console.Error.WriteLine(ex);
        }
        if (files != null) {
            for(int i = 0 ; i < files.Length ; i++) {
                yield return files[i];
            }
        }
    }
}

1
@soandos 재귀 적 재분석 지점에서 EnumerateFiles에서 IOException이 발생 함 "시스템에서 파일 이름을 확인할 수 없습니다"
SerG

5
파일 확장자가 없는 파일이 *.*포함되어 있는지 여부를 알고 싶은 모든 사람들에게 : 예, 1 분 전에 테스트했습니다.
Tobias Knauss

1
이것을 사용하려면 다음을 추가해야합니다.using System.IO;
Reinstate Monica-Goodbye SE

7
@Wikis와 사용 Console하려면 추가해야 using System;하지만 IDE는 필요한 모든 using지시문 (ctrl +.) 추가 할 수 있으므로 여기서 이국적인 것을 사용하지 않으므로 일반적으로 포함시키지 않는 것이 일반적입니다. 도대체, 당신은 또한 class정의 등이 필요할 것입니다 . 그냥 말하세요
Marc Gravell

1
우리는 그래서 언제나 환영입니다 문 사용을 포함하여, 이제 .NET 코어 및 Visual Studio 코드의 세계에있어 @MarcGravell 모든 검색과 무의미 "야크 면도"일련의 저장 예를 들어 .NET 코드를
JohnC를

98
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)

2
로그인 사용자가 일부 폴더에 액세스 할 수없는 경우 오류를 피하는 방법
Romil Kumar Jain이

5
@Romil 나는이 코드 스 니펫이 전체 기능을 나타내려고 노력하지 않는다고 생각하지만 OP가 원하던 원시 기능만을 나타냅니다. 공유해 주셔서 감사합니다, Pescuma!
kayleeFrye_onDeck

@ kayleeFrye_onDeck, 파일을 가져 오는 동안 폴더 중 하나가 발생하는 경우에만 관심을 기울였습니다. 이 문제로 인해 사용자 정의 재귀 함수를 구현합니다.
Romil Kumar Jain

3
이 솔루션과 함께 "UnauthorizedAccessException"이 수신됩니다. 이와 같은 오류를 처리 할 수있는 솔루션이 있어야합니다.
Kairan

13

.NET 4.5에는 최소한이 버전이 훨씬 짧으며 목록에 포함 할 파일 기준을 평가할 수있는 추가 보너스가 있습니다.

public static IEnumerable<string> GetAllFiles(string path, 
                                              Func<FileInfo, bool> checkFile = null)
{
    string mask = Path.GetFileName(path);
    if (string.IsNullOrEmpty(mask)) mask = "*.*";
    path = Path.GetDirectoryName(path);
    string[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories);

    foreach (string file in files)
    {
        if (checkFile == null || checkFile(new FileInfo(file)))
            yield return file;
    }
}

다음과 같이 사용하십시오.

var list = GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList();

이것은 빈 디렉토리가있는 경우를 처리하지 않습니다 ... 함수 내에 return 문이 없습니다.
FrumkinWY

@FrumkinWY 빈 디렉토리는 어떻게됩니까? 지금은 이것을 테스트하기에 편리한 기계가 없습니다.
John Kaster

12
IEnumerable<string> GetFilesFromDir(string dir) =>
 Directory.EnumerateFiles(dir).Concat(
 Directory.EnumerateDirectories(dir)
          .SelectMany(subdir => GetFilesFromDir(subdir)));

3

Framework 2.0에서는 다음을 사용할 수 있습니다 (루트 폴더의 파일을 나열합니다. 가장 인기있는 답변입니다).

static void DirSearch(string dir)
{
    try
    {
        foreach (string f in Directory.GetFiles(dir))
            Console.WriteLine(f);
        foreach (string d in Directory.GetDirectories(dir))
        {
            Console.WriteLine(d);
            DirSearch(d);
        }

    }
    catch (System.Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

3

훌륭한 답변이지만 이러한 답변으로 내 문제를 해결하지 못했습니다.

폴더 권한 문제가 발생하자마자 "권한이 거부되었습니다"코드가 실패합니다. 이것이 "권한 거부"문제를 해결하는 데 사용한 것입니다.

private int counter = 0;

    private string[] MyDirectories = Directory.GetDirectories("C:\\");

    private void ScanButton_Click(object sender, EventArgs e)
    {
        Thread MonitorSpeech = new Thread(() => ScanFiles());
        MonitorSpeech.Start();
    }

    private void ScanFiles()
    {
        string CurrentDirectory = string.Empty;

        while (counter < MyDirectories.Length)
        {
            try
            {
                GetDirectories();
                CurrentDirectory = MyDirectories[counter++];
            }
            catch
            {
                if (!this.IsDisposed)
                {
                    listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + CurrentDirectory); });
                }
            }
        }
    }

    private void GetDirectories()
    {
        foreach (string directory in MyDirectories)
        {
            GetFiles(directory);
        }
    }

    private void GetFiles(string directory)
    {
        try
        {
            foreach (string file in Directory.GetFiles(directory, "*"))
            {
                listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add(file); });
            }
        }
        catch
        {
            listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + directory); });
        }
    }

이것이 다른 사람들을 돕기를 바랍니다.


3

간단하고 깨끗한 솔루션

/// <summary>
/// Scans a folder and all of its subfolders recursively, and updates the List of files
/// </summary>
/// <param name="sFullPath">Full path of the folder</param>
/// <param name="files">The list, where the output is expected</param>
internal static void EnumerateFiles(string sFullPath, List<FileInfo> fileInfoList)
{
    try
    {
        DirectoryInfo di = new DirectoryInfo(sFullPath);
        FileInfo[] files = di.GetFiles();

        foreach (FileInfo file in files)
            fileInfoList.Add(file);

        //Scan recursively
        DirectoryInfo[] dirs = di.GetDirectories();
        if (dirs == null || dirs.Length < 1)
            return;
        foreach (DirectoryInfo dir in dirs)
            EnumerateFiles(dir.FullName, fileInfoList);

    }
    catch (Exception ex)
    {
        Logger.Write("Exception in Helper.EnumerateFiles", ex);
    }
}

3
DirectoryInfo.GetFiles ()가 수동으로 수행하는 작업을 수동으로 수행합니다. SearchOption.AllDirectories와 함께 오버로드를 사용하면 자체적으로 모두 재귀됩니다. 그는 그래서 복잡한 솔루션입니다.
philw

2

문자열뿐만 아니라 FileInfo를 얻을 수 있기 때문에 DirectoryInfo를 선호합니다.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x)
            .ToList();

미래에 FileInfo의 속성을 기반으로 향후 필터링이 필요한 경우 에이 작업을 수행합니다.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<FileInfo> matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Where(x => x.LastWriteTimeUtc < DateTimeOffset.Now)
            .Select(x => x)
            .ToList();

필요하다면 끈으로 다시 돌아갈 수도 있습니다. (그리고 여전히 필터 / where-clause 항목에 대해서는 증명됩니다.

        string baseFolder = @"C:\temp";
        DirectoryInfo di = new DirectoryInfo(baseFolder);

        string searchPattern = "*.xml";

        ICollection<string> matchingFileNames = di.GetFiles(searchPattern, SearchOption.AllDirectories)
            .Select(x => x.FullName)
            .ToList();

확장명으로 파일링하려면 " . "이 유효한 검색 패턴입니다.


1
private void GetFiles(DirectoryInfo dir, ref List<FileInfo> files)
{
    try
    {
        files.AddRange(dir.GetFiles());
        DirectoryInfo[] dirs = dir.GetDirectories();
        foreach (var d in dirs)
        {
            GetFiles(d, ref files);
        }
    }
    catch (Exception e)
    {

    }
}

1
매개 변수 files가 왜 ref됩니까? 필요가 없습니다.
Massimiliano Kraus

@MassimilianoKraus 나는 필요하지는 않지만 그의 방법이 변경 files되고 new List<FileInfo>()더 이상 쓸모없는 매개 변수로 더 이상 줄 수 없다는 것을 분명히 합니다. 일부 하위 최적화를 허용하고 필요한 경우가 아니면 새 객체를 만들지 않아도됩니다.
jeromej

@JeromeJ OOP가 무엇인지 알면 객체를 메소드에 전달할 때마다 해당 메소드가 객체의 속성 / 필드를 변경할 수 있다는 것을 알고 있습니다. 따라서 ref더 명확한 것은 없습니다. ref의 목적은 전체 변경하는 것입니다 files그것은 위험한 작업이고 여기에 대한 필요가 없습니다 : 당신은 단지 다른 목록에에 다시 포인트가하지 않아도 목록 채울 수조차 메소드의 호출에 대한 포인터를 힙. ref매우 특별한 경우에만 사용해야합니다. 대부분의 경우보다 기능적인 패러다임 방식으로 구현해야합니다.
Massimiliano Kraus

1

를 피하기 위해 다음을 UnauthorizedAccessException사용합니다.

var files = GetFiles(@"C:\", "*.*", SearchOption.AllDirectories);
foreach (var file in files)
{
    Console.WriteLine($"{file}");
}

public static IEnumerable<string> GetFiles(string path, string searchPattern, SearchOption searchOption)
{
    var foldersToProcess = new List<string>()
    {
        path
    };

    while (foldersToProcess.Count > 0)
    {
        string folder = foldersToProcess[0];
        foldersToProcess.RemoveAt(0);

        if (searchOption.HasFlag(SearchOption.AllDirectories))
        {
            //get subfolders
            try
            {
                var subfolders = Directory.GetDirectories(folder);
                foldersToProcess.AddRange(subfolders);
            }
            catch (Exception ex)
            {
                //log if you're interested
            }
        }

        //get files
        var files = new List<string>();
        try
        {
            files = Directory.GetFiles(folder, searchPattern, SearchOption.TopDirectoryOnly).ToList();
        }
        catch (Exception ex)
        {
            //log if you're interested
        }

        foreach (var file in files)
        {
            yield return file;
        }
    }
}

1

파일 이름 만 필요하고 여기서 대부분의 솔루션을 좋아하지 않기 때문에 (기능 측면 또는 가독성 측면)이 게으른 파일은 어떻습니까?

private void Foo()
{
  var files = GetAllFiles("pathToADirectory");
  foreach (string file in files)
  {
      // Use can use Path.GetFileName() or similar to extract just the filename if needed
      // You can break early and it won't still browse your whole disk since it's a lazy one
  }
}

/// <exception cref="T:System.IO.DirectoryNotFoundException">The specified path is invalid (for example, it is on an unmapped drive).</exception>
/// <exception cref="T:System.UnauthorizedAccessException">The caller does not have the required permission.</exception>
/// <exception cref="T:System.IO.IOException"><paramref name="path" /> is a file name.-or-A network error has occurred.</exception>
/// <exception cref="T:System.IO.PathTooLongException">The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must be less than 248 characters and file names must be less than 260 characters.</exception>
/// <exception cref="T:System.ArgumentNullException"><paramref name="path" /> is null.</exception>
/// <exception cref="T:System.ArgumentException"><paramref name="path" /> is a zero-length string, contains only white space, or contains one or more invalid characters as defined by <see cref="F:System.IO.Path.InvalidPathChars" />.</exception>
[NotNull]
public static IEnumerable<string> GetAllFiles([NotNull] string directory)
{
  foreach (string file in Directory.GetFiles(directory))
  {
    yield return file; // includes the path
  }

  foreach (string subDir in Directory.GetDirectories(directory))
  {
    foreach (string subFile in GetAllFiles(subDir))
    {
      yield return subFile;
    }
  }
}


0

이름에 어딘가에 특정 문자열이 포함 된 XML 파일과 같이 특정 패턴의 이름을 가진 파일을 찾아야하는 경우 Hernaldo를 기반으로 한 내 견해는 다음과 같습니다.

// call this like so: GetXMLFiles("Platypus", "C:\\");
public static List<string> GetXMLFiles(string fileType, string dir)
{
    string dirName = dir; 
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            if ((f.Contains(fileType)) && (f.Contains(".XML")))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}

0

모델링 할 파일 및 폴더 나열, 사용자 정의 구현.
시작 디렉토리에서 시작하여 모든 파일과 폴더의 전체 목록이 작성됩니다.

public class DirOrFileModel
    {
        #region Private Members

        private string _name;
        private string _location;
        private EntryType _entryType;

        #endregion

        #region Bindings

        public string Name
        {
            get { return _name; }
            set
            {
                if (value == _name) return;
                _name = value;
            }
        }

        public string Location
        {
            get { return _location; }
            set
            {
                if (value == _location) return;
                _location = value;
            }
        }

        public EntryType EntryType
        {
            get { return _entryType; }
            set
            {
                if (value == _entryType) return;
                _entryType = value;
            }
        }

        public ObservableCollection<DirOrFileModel> Entries { get; set; }

        #endregion

        #region Constructor

        public DirOrFileModel()
        {
            Entries = new ObservableCollection<DirOrFileModel>();
        }

        #endregion
    }

    public enum EntryType
    {
        Directory = 0,
        File = 1
    }

방법:

 static DirOrFileModel DirSearch(DirOrFileModel startDir)
        {
            var currentDir = startDir;
            try
            {
                foreach (string d in Directory.GetDirectories(currentDir.Location))
                {
                    var newDir = new DirOrFileModel
                    {
                        EntryType = EntryType.Directory,
                        Location = d,
                        Name = Path.GetFileName(d)
                    };
                    currentDir.Entries.Add(newDir);

                    DirSearch(newDir);
                }

                foreach (string f in Directory.GetFiles(currentDir.Location))
                {
                    var newFile = new DirOrFileModel
                    {
                        EntryType = EntryType.File,
                        Location = f,
                        Name = Path.GetFileNameWithoutExtension(f)
                    };
                    currentDir.Entries.Add(newFile);
                }

            }
            catch (Exception excpt)
            {
                Console.WriteLine(excpt.Message);
            }
            return startDir;
        }

용법:

var dir = new DirOrFileModel
            {
                Name = "C",
                Location = @"C:\",
                EntryType = EntryType.Directory
            };

            dir = DirSearch(dir);

0

짧고 간단한 솔루션

string dir = @"D:\PATH";

DateTime from_date = DateTime.Now.Date;
DateTime to_date = DateTime.Now.Date.AddHours(23);
var files = Directory.EnumerateFiles(dir, "*.*",SearchOption.AllDirectories).Select(i=>new FileInfo(i))
.Where(file=>file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
foreach(var fl in files)
    Console.WriteLine(fl.FullName);

0

이것은 디렉토리와 하위 디렉토리의 모든 파일을 얻는 데 도움이되었습니다. 누군가에게 도움이 될 수 있습니다. [위의 답변에서 영감을 얻음]

static void Main(string[] args)
    {
        try
        {
            var root = @"G:\logs";
            DirectorySearch(root);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadKey();
    }





public static void DirectorySearch(string root, bool isRootItrated = false)
{
    if (!isRootItrated)
    {
        var rootDirectoryFiles = Directory.GetFiles(root);
        foreach (var file in rootDirectoryFiles)
        {
            Console.WriteLine(file);
        } 
    }

    var subDirectories = Directory.GetDirectories(root);
    if (subDirectories?.Any() == true)
    {
        foreach (var directory in subDirectories)
        {
            var files = Directory.GetFiles(directory);
            foreach (var file in files)
            {
                Console.WriteLine(file);
            }
            DirectorySearch(directory, true);
        }
    }
}

0
var d = new DirectoryInfo(@"C:\logs");
var list = d.GetFiles("*.txt").Select(m => m.Name).ToList();

0

디렉토리에서 아래로 내려 가고 폴더를 제외시키는 옵션이 max 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

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

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

-1

다음은 Excel 파일에 정적이 아닌 B. Clay Shannon의 코드 버전입니다.

class ExcelSearcher
{
    private List<string> _fileNames;

    public ExcelSearcher(List<string> filenames)
    {
        _fileNames = filenames;
    }
    public List<string> GetExcelFiles(string dir, List<string> filenames = null)
    {

        string dirName = dir;
        var dirNames = new List<string>();
        if (filenames != null)
        {
            _fileNames.Concat(filenames);
        }
        try
        {
            foreach (string f in Directory.GetFiles(dirName))
            {
                if (f.ToLower().EndsWith(".xls") || f.ToLower().EndsWith(".xlsx"))
                {
                    _fileNames.Add(f);
                }
            }
            dirNames = Directory.GetDirectories(dirName).ToList();
            foreach (string d in dirNames)
            {
                GetExcelFiles(d, _fileNames);
            }
        }
        catch (Exception ex)
        {
            //Bam
        }
        return _fileNames;
    }

-1

매우 간단한 솔루션은 파일 목록을 반환합니다.

    public static List<string> AllFilesInFolder(string folder)
    {
        var result = new List<string>();

        foreach (string f in Directory.GetFiles(folder))
        {
            result.Add(f);
        }

        foreach (string d in Directory.GetDirectories(folder))
        {
            result.AddRange(AllFilesInFolder(d));
        }

        return result;
    }

-2
static void Main(string[] args)
        {
            string[] array1 = Directory.GetFiles(@"D:\");
            string[] array2 = System.IO.Directory.GetDirectories(@"D:\");
            Console.WriteLine("--- Files: ---");
            foreach (string name in array1)
            {
                Console.WriteLine(name);
            }
            foreach (string name in array2)
            {
                Console.WriteLine(name);
            }
                  Console.ReadLine();
        }

1
어 ... 이것은 재귀하지 않습니다
mxmissile
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.