简体   繁体   English

如何在列表中存储子目录c#

[英]How to Store Sub directory in a list c#

the below code will display all sub-directories contained in the main directory下面的代码将显示主目录中包含的所有子目录
i need to get the data displayed by method LoadSubDirs(string dir) stored in a list我需要获取存储在列表中的方法 LoadSubDirs(string dir) 显示的数据

class Program
{

    static void Main(string[] args)
    {
        string root = @"D:\";
        string[] subdirectories = Directory.GetDirectories(root);

        foreach (string subdir in subdirectories)
        {
            LoadSubDirs(subdir);


        }

    }
    private static void LoadSubDirs(string dir)
    {
        Console.WriteLine(dir);

        try
        {
            string[] subdirectories = Directory.GetDirectories(dir);

            foreach (string subdir in subdirectories)
            {
                try
                {
                    LoadSubDirs(subdir);
                }
                catch { }


            }
        }
    }
}

This is your code, with the directory saved in a List object这是您的代码,目录保存在 List 对象中

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        string root = @"D:\";
        string[] subdirectories = Directory.GetDirectories(root);
        List<string> listDirs = new List<string>();

        foreach (string subdir in subdirectories)
        {
            LoadSubDirs(subdir, listDirs);
        }

    }
    private static void LoadSubDirs(string dir, List<string> listDirs)
    {
        Console.WriteLine(dir);
        listDirs.Add(dir);

        try
        {
            string[] subdirectories = Directory.GetDirectories(dir);

            foreach (string subdir in subdirectories)
            {
                try
                {
                    LoadSubDirs(subdir, listDirs);
                }
                catch { }
            }
        }
    }
}

If your goal is to use properly recursivity, I think you should do like that.如果您的目标是正确使用递归,我认为您应该这样做。 In my opinion if you "loop" a first time before calling your recursive function you're missing something.在我看来,如果您在调用递归函数之前第一次“循环”,那么您会遗漏一些东西。 And if you're using a class/struct like FolderStruct here, you keep the "tree", wich can be useful sometimes.如果你在这里使用像 FolderStruct 这样的类/结构,你可以保留“树”,这有时很有用。

   public class FolderStruct
{
    public string FolderName { get; set; }
    public List<FolderStruct> FolderChildren { get; set; }
}
class Program
{
    static void Main(string[] args)
    {
        FolderStruct FolderTree = new FolderStruct
        {
            FolderName = @"D:\",
            FolderChildren = new List<FolderStruct>()
        };
        LoadSubDirs(FolderTree);
        Console.ReadKey();
    }

    private static FolderStruct LoadSubDirs(FolderStruct FolderTree)
    {
        try
        {
            string[] subdirectories = Directory.GetDirectories(FolderTree.FolderName);
            if (subdirectories != null)
            {
                foreach (string subdir in subdirectories)
                {
                    var newFolder = new FolderStruct()
                    {
                        FolderName = subdir,
                        FolderChildren = new List<FolderStruct>()
                    };
                    var ret = LoadSubDirs(newFolder);
                    if (ret != null)
                        FolderTree.FolderChildren.Add(ret);
                }
                return FolderTree;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
        return null;
    }
}

See sample code below :请参阅下面的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace SAveDirectoriesXml
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        const string FOLDER = @"c:\temp";
        static XmlWriter writer = null;
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;

            writer = XmlWriter.Create(FILENAME, settings);
            writer.WriteStartDocument(true);

            DirectoryInfo info = new DirectoryInfo(FOLDER);
            WriteTree(info);

            writer.WriteEndDocument();
            writer.Flush();
            writer.Close();
            Console.WriteLine("Enter Return");
            Console.ReadLine();

        }
        static long WriteTree(DirectoryInfo info)
        {
            long size = 0;
            writer.WriteStartElement("Folder");
            try
            {
                writer.WriteAttributeString("name", info.Name);
                writer.WriteAttributeString("numberSubFolders", info.GetDirectories().Count().ToString());
                writer.WriteAttributeString("numberFiles", info.GetFiles().Count().ToString());
                writer.WriteAttributeString("date", info.LastWriteTime.ToString());


                foreach (DirectoryInfo childInfo in info.GetDirectories())
                {
                    size += WriteTree(childInfo);
                }

            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception Folder : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error", errorMsg);
            }

            FileInfo[] fileInfo = null;
            try
            {
                fileInfo = info.GetFiles();
            }
            catch (Exception ex)
            {
                string errorMsg = string.Format("Exception FileInfo : {0}, Error : {1}", info.FullName, ex.Message);
                Console.WriteLine(errorMsg);
                writer.WriteElementString("Error",errorMsg);
            }

            if (fileInfo != null)
            {
                foreach (FileInfo finfo in fileInfo)
                {
                    try
                    {
                        writer.WriteStartElement("File");
                        writer.WriteAttributeString("name", finfo.Name);
                        writer.WriteAttributeString("size", finfo.Length.ToString());
                        writer.WriteAttributeString("date", info.LastWriteTime.ToString());
                        writer.WriteEndElement();
                        size += finfo.Length;
                    }
                    catch (Exception ex)
                    {
                        string errorMsg = string.Format("Exception File : {0}, Error : {1}", finfo.FullName, ex.Message);
                        Console.WriteLine(errorMsg);
                        writer.WriteElementString("Error", errorMsg);
                    }
                }
            }

            writer.WriteElementString("size", size.ToString());
            writer.WriteEndElement();
            return size;

        }
    }
}

I'm not sure if I've totally overlooked the requirement, but it seems like you are trying to get a list of all sub-directories from root and stored them in a List<string> .我不确定我是否完全忽略了这个要求,但似乎您正在尝试从root目录获取所有子目录的列表并将它们存储在List<string>

This code will achieve exactly that without any additional methods or headache:这段代码将完全实现这一目标,无需任何额外的方法或头痛:

static void Main(string[] args)
{
    string root = @"D:\";
    List<string> listDirs = Directory.GetDirectories(root, "*.*", SearchOption.AllDirectories).ToList();
}

Using Directory.GetDirectories with the SearchOption.AllDirectories parameter will automatically return all sub-directories as an array of string .使用带有SearchOption.AllDirectories参数的Directory.GetDirectories将自动将所有子目录作为string数组返回。

Given that you want it as a List<string> , use .ToList() from Linq to convert the string array to the list.鉴于您希望将其作为List<string> ,请使用 Linq 中的.ToList()将字符串数组转换为列表。 Remember to add using System.Linq to your imports.请记住将using System.Linq添加到您的导入中。

  static void Main(string[] args)
    {
        string root = @"D:\";
        List<string> list= Recursive(root);

        foreach (string l in list)
        {
            Console.WriteLine(l);
        }

    }

      static IEnumerable<string> Recursive(string root )
    {

          string[] subdirectories = Directory.GetDirectories(root);
          yield return root;
          if(subdirectories !=null && subdirectories.Length>0)
          {
              foreach(var sub in subdirectories)
              {
                 foreach(var subsub in  Recursive(sub))
                 yield return subsub;
              }   
          }
          else
          {
             yield break;
          }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM