【问题标题】:Appropriate collection for variable-depth list?可变深度列表的适当集合?
【发布时间】:2011-01-25 07:53:05
【问题描述】:

如果我想要一个描述根目录的(递归)内容(包括目录和文件)的集合,我将如何存储它们?还是我需要想出一个包含以下内容的对象: - 当前目录 -父目录 -目录中的文件

..将它们全部放在一个大列表中,并在运行时从每个条目的父目录中手动计算出关系。

【问题讨论】:

  • DirectoryInfo 和 FileInfo 类不够?
  • @remi:我认为 DirectoryInfo 不包含 FileList。所以:没有。
  • 可以通过 DirectoryInfo.GetFiles() 获取文件列表

标签: c# list dictionary collections


【解决方案1】:

.NET 框架已经包含 Directory/File 和 DirectoryInfo/FileInfo。但如果你真的需要自己动手,我建议你有一个包含父、名称、目录(子)和文件的对象。这样您就可以愉快地在结构上上下导航。

【讨论】:

    【解决方案2】:

    如果 DirectoryInfo 和 FileInfo 类不够用,那么您应该使用 Tree structure

    【讨论】:

    • 谢谢。我应该明确指出目录/文件树只是通用解决方案提供的一个示例,树结构似乎就是它!
    【解决方案3】:

    如果你想创建分层的东西,你必须创建一个拥有自身列表的类。

    class MyDirectory
    -MyFile[] Files
    -MyDirectory Parent
    -MyDirectory[] SubDirectories
    

    【讨论】:

      【解决方案4】:

      你可以做这样的事情(语法可能有点,因为我主要在 VB 中编写代码):

      List<String> pathOfElements = new List<String>
      IO.FileSystemInfo() elementsList = New IO.DirectoryInfo("C:\").GetFileSystemInfos() 
      foreach element as FileSystemInfo in elementsList
      pathOfElements.add(element.FullPath)
      next
      

      使用GetFileSystemInfos,您可以查看给定目录中的目录和文件(此外,您可以使用GetFileSystemInfos(String) 获取与指定搜索条件匹配的文件和子目录)

      对于存储有关文件和目录的信息,如果您使用完整路径,您所需要的只是一个字符串列表。

      【讨论】:

        【解决方案5】:

        在第一次拍摄时,我会尝试这样的事情:

        public class Entry
        {
            public string Name { get; private set; }
            public EntryType Type { get; private set; }
        
            private FileInfo _FileInfo;
            private DirectoryInfo _DirectoryInfo;
        
            public Entry(FileInfo fileInfo)
            {
                _FileInfo = fileInfo;
                Type = EntryType.FileInfo;
                Name = fileInfo.Name;
            }
        
            public Entry(DirectoryInfo directoryInfo)
            {
                _DirectoryInfo = directoryInfo;
                Type = EntryType.DirectoryInfo;
                Name = directoryInfo.Name;
            }
        
            public IEnumerable<Entry> Childs
            {
                get
                {
                    if (Type != EntryType.DirectoryInfo
                        || _DirectoryInfo == null)
                    {
                        throw new ArgumentNullException();
                    }
        
                    foreach (var directory in _DirectoryInfo.GetDirectories())
                    {
                        yield return new Entry(directory);
                    }
        
                    foreach (var file in _DirectoryInfo.GetFiles())
                    {
                        yield return new Entry(file);
                    }
                }
            }
        
            public enum EntryType
            {
                None,
                FileInfo,
                DirectoryInfo
            }
        }
        

        警告

        这是未经测试的,实际上我不知道您是否会遇到yield return new ... 的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 1970-01-01
          • 2020-02-20
          • 2014-06-03
          • 2018-03-18
          • 2016-06-21
          • 1970-01-01
          相关资源
          最近更新 更多