我有一些旧代码是为支持本地网络上的工作而编写的,但现在可能由远程工作人员运行。由于所有额外的开销,在本地网络上相当快的单个文件系统访问对于远程访问来说慢得难以忍受。
对于读取文件,我通过将整个文件读取为字符串作为单次访问,并将用于处理它的 StreamReader 替换为 StringReader,从而大大提高了速度。但是在文件系统中搜索可能的文件路径有点棘手。
有一个特定的目录(“master”),其中包含许多子目录。其中一些子目录(“models”)有一个文件(“kompdef”),其中包含与模型相关的信息。 master 中还有许多其他目录没有 kompdef 文件,因此不是模型。我有一个带有下拉列表的表单,其中列出了供用户选择的模型。使用以下代码创建模型列表以填充下拉列表:
List<string> ModelNames = new List<string>();
foreach (DirectoryInfo Model in (new DirectoryInfo(MasterPath)).GetDirectories())
{
if ((new FileInfo(Model.FullName + KompdefTail)).Exists)
{
ModelNames.Add(Model.Name);
}
}
然而,这需要多次文件系统访问,这意味着该表单需要大约 30 秒才能远程加载,即使在现场只需不到 1 秒。
有什么方法可以获取以下形式的路径列表:
其中 masterpath 和 kompdeftail 已知,文件系统访问次数最少?
FileInfo
和 DirectoryInfo
,只需使用 File
和 Directory
,因为它们只是检索文件名,而不是任何其他信息。File.EnumerateFiles
使用通配符进行搜索并进行递归搜索,这也会将数据流式传输,而不是存储在数组中。Exists
,如果你有一个文件那么它就存在。ModelNames.AddRange(
Directory.EnumerateFiles(MasterPath, KompdefTail, SearchOption.AllDirectories)
);