Làm thế nào để liệt kê đệ quy tất cả các tệp trong một thư mục trong C #?


315

Làm thế nào để liệt kê đệ quy tất cả các tệp trong một thư mục và thư mục con trong C #?


1
Bạn muốn cư trú ở đâu? nếu cây ... đây là ví dụ dreamincode.net/code/snippet2591.htm
Arsen Mkrtchyan

77
chuỗi [] filenames = Directory.GetFiles (đường dẫn, "*", SearchOption.AllDirectories)
Bruce

Bạn có thể muốn xem xét câu hỏi này nơi tôi đã trình bày một mẫu mã sử dụng đệ quy để kết xuất cấu trúc thư mục trong TreeView. Logic nên giống nhau trong hầu hết các trường hợp.
Cerebrus

5
Vấn đề với điều này là nó rất dễ bị hỏng nếu bạn không có quyền truy cập vào một thư mục duy nhất: không có kết quả ...
Marc Gravell

1
Nếu bạn gặp rắc rối khi một số tệp không thể truy cập được, hãy xem xét liệt kê ngoại lệ tệp ném ngoại lệ
CodeInChaos

Câu trả lời:


186

Bài viết này bao gồm tất cả những gì bạn cần. Ngoại trừ việc tìm kiếm các tập tin và so sánh các tên, chỉ cần in ra các tên.

Nó có thể được sửa đổi như vậy:

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);
    }
}

Được thêm bởi barlop

GONeale đề cập rằng ở trên không liệt kê các tệp trong thư mục hiện tại và đề nghị đặt phần liệt kê tệp bên ngoài phần có thư mục. Sau đây sẽ làm điều đó. Nó cũng bao gồm một dòng Writeline mà bạn có thể bỏ ghi chú, giúp theo dõi bạn đang ở đâu trong đệ quy có thể giúp hiển thị các lệnh gọi để giúp hiển thị cách thức đệ quy hoạt động.

            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
Phương pháp này không liệt kê các tệp cho thư mục ban đầu, chỉ có các thư mục con và thấp hơn. Tôi sẽ di chuyển GetFiles GetDirectories bên ngoài
GONeale

1
Đôi khi người ta không muốn các tệp cho thư mục ban đầu, trong trường hợp này là hoàn hảo cho các cấu trúc nhỏ hợp lý. Đối với các danh sách rất lớn, hãy sử dụng một cái gì đó như giải pháp của Marc Gravell: stackoverflow.com/a/929418/91189
Joseph Gabriel

2
@GONeale là chính xác. Người dùng không mong đợi danh sách tập tin của thư mục gốc đầu vào sẽ ít hợp lý hơn nhiều. Đầu vào từ là chìa khóa ở đây. Nó đã được đầu vào cho một lý do.
Florin Mircea

2
Tôi đã phải thêm một lần thử xung quanh vòng lặp foreach bên trong nếu không nó không tiếp tục truy cập bị từ chối lỗi
Shaun Vermaak

3
Bạn nên tránh bắt Exception - bạn có thực sự muốn bắt OutOfMemoryException không? Chỉ bắt những gì bạn có thể xử lý.
alastairtree

435

Lưu ý rằng trong .NET 4.0 có các hàm tệp (được cho là) ​​dựa trên iterator (chứ không phải dựa trên mảng) được xây dựng trong:

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

Hiện tại tôi sẽ sử dụng một cái gì đó như dưới đây; phương thức đệ quy sẵn có bị phá vỡ quá dễ dàng nếu bạn không có quyền truy cập vào một thư mục con duy nhất ...; việc Queue<string>sử dụng tránh quá nhiều đệ quy ngăn xếp cuộc gọi và khối lặp giúp tránh chúng ta có một mảng lớn.

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 Về điểm hồi quy đệ quy Enum CảFiles ném IOException "Tên của tệp không thể được giải quyết bởi hệ thống"
SerG

5
Đối với tất cả những ai muốn biết liệu *.*cũng bao gồm các tệp không có phần mở rộng tệp hay không : Có, nó đã được kiểm tra một phút trước.
Tobias Knauss

1
Để sử dụng điều này, bạn sẽ cần thêmusing System.IO;
Phục hồi Monica - Tạm biệt SE

7
@Wikis và để sử dụng, Consolebạn sẽ cần thêm using System;- nhưng vì IDE có thể thêm tất cả các usingchỉ thị cần thiết cho bạn (ctrl +.), Và vì chúng tôi không sử dụng bất cứ điều gì kỳ lạ ở đây, nên thường không bao gồm chúng. Heck, bạn cũng sẽ cần một classđịnh nghĩa, vv Chỉ cần nói
Marc Gravell

1
@MarcGravell Hiện tại chúng ta đang ở trong thế giới .net core và Visual Studio Code, vì vậy, bao gồm cả việc sử dụng câu lệnh luôn được chào đón trong bất kỳ ví dụ nào. Mã mạng để lưu một loạt các tìm kiếm và "cạo yak" vô nghĩa
JohnC

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

2
Làm thế nào để tránh lỗi nếu người dùng đăng nhập không có quyền truy cập vào một số thư mục.
Romil Kumar Jain 10/2/2015

5
@Romil Tôi không tin đoạn mã này đang cố gắng chỉ ra chức năng đầy đủ, chỉ có chức năng thô mà OP đang tìm kiếm. Cảm ơn đã chia sẻ, Pescuma!
kayleeFrye_onDeck 10/03/2015

@kayleeFrye_onDeck, tôi chỉ quan tâm trong trường hợp nếu có bất kỳ thư mục nào được nâng lên trong khi nhận tệp. Do mối quan tâm này, chúng tôi thực hiện chức năng đệ quy tùy chỉnh của chúng tôi.
Romil Kumar Jain

3
Bạn sẽ nhận được "UnlegAccessException" với giải pháp này. Bạn nên có một giải pháp có thể xử lý các lỗi như thế này.
Kairan

13

Trong .NET 4.5, ít nhất, có phiên bản này ngắn hơn nhiều và có thêm phần thưởng để đánh giá bất kỳ tiêu chí tệp nào để đưa vào danh sách:

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;
    }
}

Sử dụng như thế này:

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

Điều này không xử lý một trường hợp bạn có một thư mục trống ... không có câu lệnh return bên trong hàm.
FrumkinWY

@FrumkinWY điều gì xảy ra với một thư mục trống? Bây giờ tôi không có máy tiện để kiểm tra cái này.
John Kaster

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

3

Trong Framework 2.0, bạn có thể sử dụng (Nó liệt kê các tệp của thư mục gốc, đây là câu trả lời phổ biến nhất):

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

Một số câu trả lời xuất sắc nhưng những câu trả lời này không giải quyết được vấn đề của tôi.

Ngay khi phát sinh vấn đề về quyền thư mục: "Quyền bị từ chối", mã không thành công. Đây là những gì tôi đã sử dụng để giải quyết vấn đề "Quyền bị từ chối":

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); });
        }
    }

Hy vọng điều này sẽ giúp những người khác.


3

Một giải pháp đơn giản và sạch sẽ

/// <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
Bạn đang làm thủ công những gì DirectoryInfo.GetFiles () sẽ làm cho bạn ra khỏi hộp - chỉ cần sử dụng quá tải với SearchOption.AllDirectories và nó sẽ tự xử lý lại. Vì vậy, đó là một giải pháp phức tạp .
philw 8/11/2016

2

Tôi thích sử dụng DirectoryInfo vì tôi có thể nhận được FileInfo, không chỉ các chuỗi.

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

        string searchPattern = "*.xml";

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

Tôi làm điều này trong trường hợp trong tương lai tôi cần lọc trong tương lai .. dựa trên các thuộc tính của 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();

Tôi cũng có thể dùng đến dây nếu cần. (và vẫn còn được chứng minh trong tương lai cho các bộ lọc / công cụ mệnh đề where.

        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();

Lưu ý rằng " . " Là mẫu tìm kiếm hợp lệ nếu bạn muốn quay theo phần mở rộng.


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
Tại sao tham số filesref? Không có nhu cầu.
Massimiliano Kraus

@MassimilianoKraus Tôi cho rằng, trong khi không bắt buộc, điều đó làm rõ hơn rằng phương pháp của anh ta sẽ thay đổi filesvà bạn không thể đưa ra new List<FileInfo>()làm tham số nữa sẽ vô dụng. Có thể cho phép một số tối ưu hóa phụ và tránh tạo một đối tượng mới trừ khi được yêu cầu.
jeromej

@JeromeJ nếu bạn biết OOP là gì, bạn biết rằng bất cứ khi nào bạn truyền một đối tượng cho một phương thức, phương thức đó có thể thay đổi các thuộc tính / trường của đối tượng. Vì vậy, refkhông làm cho mọi thứ rõ ràng hơn. Các refmục đích 's là thay đổi toàn bộ filescon trỏ ngay cả đối với người gọi của phương pháp: đó là một hoạt động nguy hiểm và đây không có nhu cầu cho điều đó: bạn chỉ có thể điền vào danh sách, bạn không cần phải tái điểm nó khác Danh sách trên đống. refchỉ nên được sử dụng trong những trường hợp rất đặc biệt; hầu hết thời gian bạn chỉ cần thực hiện mọi thứ theo cách mô hình chức năng hơn.
Massimiliano Kraus

1

Để tránh UnauthorizedAccessException, tôi sử dụng:

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

Nếu bạn chỉ cần tên tệp và vì tôi không thực sự thích hầu hết các giải pháp ở đây (tính năng khôn ngoan hoặc dễ đọc), vậy còn cái lười này thì sao?

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;
    }
  }
}

1

Kỷ lục ngắn nhất

string files = Directory.GetFiles(@"your_path", "*.jpg", SearchOption.AllDirectories);

0

Đây là góc nhìn của tôi về nó, dựa trên Hernaldo, nếu bạn cần tìm các tệp có tên của một mẫu nhất định, chẳng hạn như các tệp XML ở đâu đó trong tên của chúng có chứa một chuỗi cụ thể:

// 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

Liệt kê các tập tin và thư mục để mô hình, thực hiện tùy chỉnh.
Điều này tạo ra một danh sách đầy đủ của tất cả các tệp và thư mục bắt đầu từ thư mục bắt đầu của bạn.

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
    }

Phương pháp:

 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;
        }

Sử dụng:

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

            dir = DirSearch(dir);

0

Giải pháp ngắn gọn và đơn giản

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

Cái này giúp tôi lấy tất cả các tập tin trong một thư mục và thư mục con, có thể hữu ích cho ai đó. [Lấy cảm hứng từ câu trả lời trên]

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

Một số phiên bản cải tiến với lvl tối đa để đi xuống trong thư mục và tùy chọn để loại trừ các thư mục:

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+"  ");
        }
    }
  }
}

thư mục đầu vào:

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

đầu ra của hàm (nội dung của thư mục5 bị loại do giới hạn lvl và nội dung của thư mục3 bị loại trừ vì nó nằm trong mảng loại trừFolders):

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

-1

Đây là phiên bản mã của B. Clay Shannon không tĩnh cho các tệp excel:

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

Một giải pháp rất đơn giản, trả về một danh sách các tập tin.

    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
uhhh ... đây không phải là đệ quy
mxmissile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.