Получить атрибуты всех файлов в каталоге при доступе только к каталогу - PullRequest
3 голосов
/ 31 августа 2011

Я пытаюсь написать функцию на C #, которая получает путь к каталогу в качестве параметра и возвращает словарь, в котором ключами являются файлы непосредственно в этом каталоге, а значения - их время последнего изменения.Это легко сделать с помощью Directory.GetFiles (), а затем File.GetLastWriteTime ().Однако это означает, что каждый файл должен быть доступен, что слишком медленно для моих нужд.Есть ли способ сделать это при доступе только к каталогу?Поддерживает ли файловая система даже такое требование?

Отредактируйте, прочитав несколько ответов: Спасибо, ребята, вы все говорите почти одинаково - используйте объект FileInfo.Тем не менее, так же медленно использовать Directory.GetFiles () (или Directory.EnumerateFiles ()) для получения этих объектов, и я подозреваю, что для их получения требуется доступ к каждому файлу.Если файловая система хранит время последней модификации своих файлов только в самих файлах, не может быть способа извлечь эту информацию без доступа к файлу.Это тот случай, здесь?Получают ли GetFiles () и EnumerateFiles () из DirectoryInfo доступ к каждому файлу или получают их информацию из записи каталога?Я знаю, что если бы я хотел получить только имена файлов, я мог бы сделать это с помощью класса Directory, не обращаясь к каждому файлу.Но получение атрибутов кажется сложнее ...

Редактировать, следуя ответу Хенка: кажется, что на самом деле быстрее использовать объект FileInfo.Я создал следующий тест:

static void Main(string[] args)
    {
        Console.WriteLine(DateTime.Now);

        foreach (string file in Directory.GetFiles(@"\\169.254.78.161\dir"))
        {
            DateTime x = File.GetLastWriteTime(file);
        }

        Console.WriteLine(DateTime.Now);

        DirectoryInfo dirInfo2 = new DirectoryInfo(@"\\169.254.78.161\dir");
        var files2 = from f in dirInfo2.EnumerateFiles()
                select f;
        foreach (FileInfo file in files2)
        {
            DateTime x = file.LastWriteTime;
        }

        Console.WriteLine(DateTime.Now);
    }

Для примерно 800 файлов я обычно получаю что-то вроде:
31/08/2011 17: 14: 48
31/08/2011 17:14: 51
31.08.2011 17: 14: 52

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Я не делал никаких таймингов, но ваш лучший выбор:

DirectoryInfo di = new DirectoryInfo(myPath);
FileInfo[] files = di.GetFiles();

Я думаю, что все атрибуты FileInfo доступны в записях файла каталога, поэтому это должно (может) потребовать минимального ввода-вывода.

1 голос
/ 31 августа 2011

Единственное, о чем я могу думать, это использование класса FileInfo .Насколько я понимаю, это может помочь вам или может также прочитать файл (требуются разрешения на чтение)

...