Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Получить список файлов для NTFS раздела


sally ©   (2006-04-11 19:53:00) 

Как наиболее быстрым способом получить список файлов для NTFS раздела? Знаю, что можно не скнирую весь диск(FindFirst\FindNext).
Поизучав некоторые программы понял что рыть надо в сторону FSCTL_GET_NTFS_VOLUME_DATA и FSCTL_GET_NTFS_FILE_RECORD. Если можно то с примером.


Игорь Шевченко   (2006-04-14 00:37:00) [1]

sally   (13.04.06 18:48) [10]

Мне думается, что дефрагментатор вряд ли пользуется подобными вызовами, скорее он читает метафайлы NTFS, а вот к ним он может обращаться подобным способом, впрочем, могу ошибаться.

Еще могу сказать, что метаданные NTFS довольно неплохо описаны у Гэри Неббета.


sally   (2006-04-13 18:48:00) [2]

>Игорь Шевченко
Спасибо, это я уже излазил.
Но интересующего вопроса там нет...


Игорь Шевченко   (2006-04-13 18:31:00) [3]


> Если можно то с примером


Здесь могут найтись всякие примеры, часть из них даже с исходными текстами на С

http://www.sysinternals.com/FileAndDiskUtilities.html

И здесь

http://www.sysinternals.com/Information/DiskDefragmenting.html


Sally   (2006-04-13 17:58:00) [4]

8-10: Это означает, что проводилось несколько раз. Замерялось секундомером.
FindFirst\FindNext:
 никакого другого кода я не использовал нигде. Кроме разве, что следующего

procedure Form1.Button1Click(Sender: TObject);
var
 AStart: TDateTime;
begin
 AStart := Now;
 BuildFileList('D:\');
 Caption := FormatDateTime('nn:ss:zzz', Now - AStart);
end;


Poirot   (2006-04-13 17:53:00) [5]

Измерения!!! Просто так на глазик или под дебагом или ещё как?!
ИМХО утверждения весьма и весьма голословное.
Цифры есть, но откуда они взяты?!
Хотелось бы увидеть полный отчёт по выполнению вашего кода и того, что вы назвали Windows... 8-10 это как? знавал я одних товарисчей которые секунды считали про себя и вместо 5 реальный они до 15 насчитывали :)
Есть много профайлеров - попробуйте им... мб и сами увидите где собака порылась...
Вообще то, вы меряете не только код FindFirstFile и т.п., а ещё туеву кучу дополнительного специфичного барахла :)


sally   (2006-04-13 17:46:00) [6]

>Poirot
принцып ЧЕГО???


Poirot   (2006-04-12 19:49:00) [7]

А принцып можно в студию тоже?!


Sally   (2006-04-12 11:14:00) [8]

Раздел:  тип - NTFS, объем - 45ГБ, занято - 36 ГБ, кол-во файлов - 220 000
Windows - 8-10 секунд
FindFirst\FindNext - 45 секунд

Исходный код
procedure BuildFileList(const APath: PAnsiChar);
var
 AFileHandle: THandle;
 AFindFileData: TWin32FindData;
 AFileName: string;
begin
 AFileHandle := FindFirstFile(PAnsiChar(APath + '*'), AFindFileData);
 if AFileHandle <> INVALID_HANDLE_VALUE then
 try
   repeat
     if AFindFileData.cFileName[0] = '.' then Continue;
     AFileName := string(APath) + AFindFileData.cFileName;
     if (AFindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0 then
         BuildFileList(PAnsiChar(AFileName + '\'));
   until not FindNextFile(AFileHandle, AFindFileData);
 finally
   Windows.FindClose(AFileHandle)
 end
end;


Игорь Шевченко   (2006-04-12 10:54:00) [9]


> то FindFirst\FindNext просто никакие по сравнению с ним.


Результаты сравнений с временными характеристиками - в студию.


sally   (2006-04-12 10:42:00) [10]

Если глянуть на ту скорость, с которой стандартный виндовый дефрагментатор анализирует раздел NTFS, то FindFirst\FindNext просто никакие по сравнению с ним.


Gero   (2006-04-12 01:05:00) [11]

FindFirst\FindNext достаточно быстры.


Наверх

Титульная страница Поиск, карта сайта Написать письмо