我有一个大约15-30万个文件的目录.我需要拉最老的一个.换句话说,首先创建的那个.有没有一种快速的方法来使用C#,除了将它们加载到一个集合然后排序?
Kir*_*rst 19
您必须将FileInfo对象加载到集合和排序中,但它是一个单行:
FileSystemInfo fileInfo = new DirectoryInfo(directoryPath).GetFileSystemInfos()
.OrderBy(fi => fi.CreationTime).First();
Run Code Online (Sandbox Code Playgroud)
好的,两行是因为它是一个很长的陈述.
Joh*_*ers 12
如果您控制目录(即,如果您的程序负责创建和维护该目录中的所有文件),那么您应该考虑单独跟踪每个文件的元数据; 也许在数据库中.
实际上,SQL Server 2008中的FileStream列类型可以帮助解决这个问题.您可以创建一个表,其中包含文件名,创建日期,修改日期和内容的FileStream列的列.您可以使用元数据列上的索引查找最旧的文件.您可以使用FileStream列找到内容.
你不能不排序就做,但你能做的就是让它快。
排序依据CreationTime可能很慢,因为首先访问每个文件的此属性涉及对文件系统的询问。
使用更快的目录枚举器,它可以在枚举时保留有关文件的更多信息,并允许更快地进行排序。
比较性能的代码:
static void Main(string[] args)
{
var timer = Stopwatch.StartNew();
var oldestFile = FastDirectoryEnumerator.EnumerateFiles(@"c:\windows\system32")
.OrderBy(f => f.CreationTime).First();
timer.Stop();
Console.WriteLine(oldestFile);
Console.WriteLine("FastDirectoryEnumerator - {0}ms", timer.ElapsedMilliseconds);
Console.WriteLine();
timer.Reset();
timer.Start();
var oldestFile2 = new DirectoryInfo(@"c:\windows\system32").GetFiles()
.OrderBy(f => f.CreationTime).First();
timer.Stop();
Console.WriteLine(oldestFile2);
Console.WriteLine("DirectoryInfo - {0}ms", timer.ElapsedMilliseconds);
Console.WriteLine("Press ENTER to finish");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
对我来说,它给出了这个:
VEN2232.OLB
FastDirectoryEnumerator - 27ms
VEN2232.OLB
目录信息 - 559 毫秒
| 归档时间: |
|
| 查看次数: |
18970 次 |
| 最近记录: |