Я только что столкнулся с этим. Хорошая реализация родной версии.
Эта версия, хотя и медленнее, чем версия, использующая FindFirst
и FindNext
, немного быстрее, чем ваша оригинальная версия .NET.
static List<Info> RecursiveMovieFolderScan(string path)
{
var info = new List<Info>();
var dirInfo = new DirectoryInfo(path);
foreach (var entry in dirInfo.GetFileSystemInfos())
{
bool isDir = (entry.Attributes & FileAttributes.Directory) != 0;
if (isDir)
{
info.AddRange(RecursiveMovieFolderScan(entry.FullName));
}
info.Add(new Info()
{
IsDirectory = isDir,
CreatedDate = entry.CreationTimeUtc,
ModifiedDate = entry.LastWriteTimeUtc,
Path = entry.FullName
});
}
return info;
}
Он должен выдавать тот же вывод, что и ваша нативная версия. Мои тесты показывают, что эта версия занимает примерно в 1,7 раза больше, чем версия, которая использует FindFirst
и FindNext
. Время получено в режиме релиза без отладчика.
Любопытно, что изменение GetFileSystemInfos
на EnumerateFileSystemInfos
добавляет около 5% времени выполнения в моих тестах. Я скорее ожидал, что он будет работать с той же скоростью или, возможно, быстрее, потому что ему не нужно было создавать массив объектов FileSystemInfo
.
Следующий код еще короче, потому что он позволяет Framework заботиться о рекурсии. Но это на 15-20% медленнее, чем версия выше.
static List<Info> RecursiveScan3(string path)
{
var info = new List<Info>();
var dirInfo = new DirectoryInfo(path);
foreach (var entry in dirInfo.EnumerateFileSystemInfos("*", SearchOption.AllDirectories))
{
info.Add(new Info()
{
IsDirectory = (entry.Attributes & FileAttributes.Directory) != 0,
CreatedDate = entry.CreationTimeUtc,
ModifiedDate = entry.LastWriteTimeUtc,
Path = entry.FullName
});
}
return info;
}
Опять же, если вы измените это значение на GetFileSystemInfos
, оно будет немного (но только немного) быстрее.
Для моих целей первое решение, приведенное выше, достаточно быстрое. Нативная версия запускается примерно за 1,6 секунды. Версия, которая использует DirectoryInfo
, запускается примерно за 2,9 секунды. Полагаю, если бы я часто проводил эти сканы, я бы передумал.