Список всех папок и файлов для x глубины - PullRequest
2 голосов
/ 26 мая 2011

Я хочу иметь список всех папок и файлов для x глубины.

Если x равен 2, у меня будет информация обо всех папках и файлах из первой папки и обо всех папках и файлах из папок в первой папке.

Как это сделать?

Ответы [ 5 ]

4 голосов
/ 26 мая 2011

Этот код будет делать то же, что и другие ответы, но также будет возвращать имена папок (так как это кажется частью того, что вы спрашиваете).Для этого потребуется .Net 4.0.Если вы хотите отслеживать, какие папки и какие файлы, вы можете вернуть кортеж, содержащий список файлов и список папок.

List<string> GetFilesAndFolders(string root, int depth)
{
    var list = new List<string>();
    foreach(var directory in Directory.EnumerateDirectories(root))
    {
        list.Add(directory);
        if (depth > 0)
        {
            list.AddRange(GetFilesAndFolders(directory, depth-1));
        }
    }

    list.AddRange(Directory.EnumerateFiles(root));

    return list;
}

РЕДАКТИРОВАТЬ: код, который хранит папки и файлы отдельно

Tuple<List<string>,List<string>> GetFilesAndFolders(string root, int depth)
{
    var folders = new List<string>();
    var files = new List<string>();
    foreach(var directory in Directory.EnumerateDirectories(root))
    {
        folders.Add(directory);
        if (depth > 0)
        {
                var result = GetFilesAndFolders(directory, depth-1);
                folders.AddRange(result.Item1);
                files.AddRange(result.Item2);
        }
    }

    files.AddRange(Directory.EnumerateFiles(root));

    return new Tuple<List<string>,List<string>>(folders, files);
}
2 голосов
/ 26 мая 2011

ОК, вот простое решение.

private static IList<string> GetFilesToDepth(string path, int depth)
{
    var files = Directory.EnumerateFiles(path).ToList();

    if (depth > 0)
    {
        var folders = Directory.EnumerateDirectories(path);

        foreach (var folder in folders)
        {                    
            files.AddRange(GetFiles(folder, depth - 1));
        }
    }

    return files;
}

Может быть привлекательным изменить это значение на EnumFilesToDepth(), то есть избавиться от ToList ().Это потребовало бы немного больше размышлений и работы, хотя рекурсивный итератор сложен.

2 голосов
/ 26 мая 2011

если вам нужны только имена файлов, вы можете сделать это рекурсивным методом. что-то вроде того: (нет гарантии полной корректности, я пишу без компилятора)

    public static List<String> GetSubfoldersAndFiles(DirectoryInfo di, int deep)
    {
       List<string> myContent = new List<string>();
       foreach(FileInfo fi in di.GetFiles())
       {
          myContent.Add(fi.FullName);
       }

       if(deep > 0)
       {
          foreach(DirectoryInfo subDi in di.GetDirectories())
          {
              myContent.AddRange(GetSubfoldersAndFiles(subDi, deep - 1).ToArray());
          }
       }

       return myContent;
    }

и вызов будет таким:

List<string> content = GetSubfoldersAndFiles(new DirectoryInfo(@"c:\", 3));
2 голосов
/ 26 мая 2011

Мне кажется, что это было решено раньше.По сути, вы хотите спросить текущий файл, является ли он каталогом, если оно истинно и x еще не исчерпан, захватите подкаталоги этого файла.Кроме того, вам нужно проверить, есть ли файлы в этом каталоге, а также получить их.

1 голос
/ 31 января 2012

Все подпапки

public List<string> listDir(string pPath)
        {
            List<string> dirList = new List<string>();
            listDir(pPath, dirList);
            return dirList;
        }
private void listDir(string pPath, List<string> pList)
        {
                string[] loDirs = System.IO.Directory.GetDirectories(pPath);
                foreach (string loDir in loDirs)
                {
                    pList.Add(loDir);
                    listDir(loDir, pList);
                }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...