带递归的目录/文件树?

时间:2014-12-08 17:53:32

标签: c# algorithm sorting

您好我正在创建一个程序,用户可以使用文件和/或更多文件夹以及可能包含更多文件和文件夹等的文件或文件夹放入

我的每个文件对象都有一个名为上面文件夹名称的字段,它将存储它们上面的文件夹的路径。顶部文件夹名称是他们首先删除的名称。将来,如果他们在根级别添加多个目录,我会处理它,但是现在你可以假设他们只会放入一个顶级文件夹。

到目前为止,这是我的代码:

 foreach (string fileDropped in files)
        {

            if(Directory.Exists(fileDropped))
            {
                // folder
                string[] filesInFolder = Directory.GetFiles(fileDropped);
                string folderName = fileDropped.Substring(fileDropped.LastIndexOf('\\') + 1);
                foreach(string fileTemp in filesInFolder)
                {
                    //if this is a directory then do this loop again with recursion?
                    File file = new File(fileTemp);
                    file.aboveFolderName = folderName;
                    dataStorage.AddFileToList(file);
                }
            }
            else
            {
                File file = new File(fileDropped);
                dataStorage.AddFileToList(file);

            }



        }

多个图层的文件将包含根文件夹的整个路径

"TestFolder/SubTestFolder/SubSubFolder/File.txt"

关于我应该如何构建这个的任何建议或想法? 感谢

2 个答案:

答案 0 :(得分:1)

以下是您如何进行递归

        public void Recursion(string path, IList<string> paths)
        {
            paths.Add(path);
            if(Directory.Exists(path))
            {
                DirectoryInfo directory = new DirectoryInfo(path);
                paths.Add(directory.FullName);

                foreach (var file in directory.EnumerateFiles())
                {
                    paths.Add(file.FullName);
                }

                foreach (var dir in directory.EnumerateDirectories())
                {
                    Recursion(dir.FullName, paths);
                }
            }
        }

答案 1 :(得分:0)

您可以使用搜索所有子目录的Directory.GetFiles重载。

var allFiles = Directory.GetFiles(path, "*.*", SearchOptions.AllDirectores)

这将返回给定路径和所有子目录中所有文件的所有绝对路径的数组。您可以截断这样返回的路径。

DirectoryInfo dir = new DirectoryInfo(path);
foreach(string file in allFiles)
{
    int startOfPath = 0;
    if(dir.Parent != null)
        startOfPath = dir.Parent.FullName.Length + 1;
    File f = new File(file.Substring(startOfPath));
}