【问题标题】:How to avoid reading file system more than once如何避免多次读取文件系统
【发布时间】:2014-08-22 20:34:09
【问题描述】:

我有一些类,它们查看目录和子目录以检查这些文件夹和文件的结构是否符合类要求。例如。我有一个 JPEG 类,它在所有子目录中查找任何 .jpeg。有些类甚至更复杂,其中一些目录和子目录需要有特定的名称,并且应该包含一些具有指定扩展名的文件。

因此我目前遇到的问题是我需要多次读取文件系统来进行这些计算,因为类有不同的要求,无法在一个循环中解决。

到目前为止,我正在做的事情:我已经使用 Directory.GetFiles(path)Directory.GetDirectories(path) 为每个类在文件系统上实现了一个循环,并检查我的类是否可以读取该结构

我的问题是:我怎样才能提高我的表现。如果我可以将文件系统(来自所选路径的目录和子目录)存储到我的内存中,我认为这将是一个很大的性能提升,也许是在树结构中以避免多个文件系统调用?这是最好的行为吗?还是您认为这不会带来性能提升?我还有其他方法可以提高性能吗?

如果树是最佳解决方案 - 您将如何实施?

public class TreeNode
{
   List<TreeNode> nodes;
   FileInfo currentFileInfo;
   DirectoryInfo currentDirectoryInfo;
}

这种结构适合我的问题吗?

问候

【问题讨论】:

  • 相反的组织怎么样 - 浏览每个文件和目录以及每个处理类的每个文件进程/签入循环。
  • 我试过了,但正如我所提到的,这非常困难,因为每个处理类都需要不同的信息。其中一些只需要一个文件,另一些则需要整个目录、子目录或其他属性。我需要以某种方式存储这些信息,以便以后继续。

标签: c# performance loops filesystems


【解决方案1】:

我通过先读取所有文件信息并稍后通过不同的类对其进行分析,成功地提高了性能。根据你的问题,是的,我建议这样做。

我不知道您的“文件类型特定”类是如何工作的。但一般来说,如果你创建一个树作为数据结构,你将有一些工作来维护节点和遍历。

为什么不像这样简单地创建ListArrayListCollectionHashtable元素:

ArrayList directoryInformation = new ArrayList();
...
...
Hashtable fileEntry = new Hashtable();
fileEntry.add("name", theFileName);
fileEntry.add("type", theFileType);
fileEntry.add("path", theFilePath);
...
...
directoryInformation.add (fileEntry);

一旦构建了列表,您的类就可以简单地遍历列表并从Hashtable 条目中获取所需的信息。此外,通过向每个元素添加路径,您可以展平树结构,因此您只需递归执行一次。

Hashtables 唯一的缺点是它没有类型,所以如果你添加一些错误的字符串,编译器不会咳嗽。但它通过灵活和快速的编写来返回价值。

【讨论】:

  • 您好,感谢您的回答!我考虑过使用一个简单的列表,但是在某些类中我会遇到问题,我需要接收有关目录和子目录或位于目录中的文件的信息,例如“名称为 XY 的文件:目录的名称是什么?” - 在这种情况下,我将不得不再次循环循环,不是吗?也许如果我使用 FileInformation 而不是 HashTable?或者将父路径另存为我的哈希表中的值...嗯无论如何+1为您的答案!
  • 很高兴为您提供帮助 :-) - 是的,您选择的解决方案取决于更改现有帮助程序类的工作量。如果您查看这些类的代码,从访问文件系统更改为解释列表和字符串是否是一项艰巨的工作? - 最后,如果我理解正确,无论如何你都会“循环几次”。我发现多次循环到一个准备好的统一列表,甚至简单地查询该列表,比在文件系统中循环几次要优雅得多。如果您以巧妙的方式创建列表,您的服务类可以查询它,因此您不会“感觉到”循环。
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 2023-03-08
  • 1970-01-01
  • 2019-07-05
  • 2016-11-22
  • 2011-04-07
  • 2013-08-12
  • 2019-10-06
相关资源
最近更新 更多