![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить список файлов для 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 достаточно быстры.