适当收集可变深度列表?

时间:2010-03-09 07:44:05

标签: c# list dictionary collections

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

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

你可以做这样的事情(sytax可能有点像,因为我主要用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,您可以在gived目录中看到目录和文件(另外,您可以使用GetFileSystemInfos(String)来获取与指定搜索条件匹配的文件和子目录)

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

答案 4 :(得分:0)

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

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 ...的问题。