![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать чтобы FindFirst и FindNext искали в папке Temporary I [D7, WinXP]
RoLeX2004 © (2004-09-18 15:38:00)У меня программа ищет файлы с маской *.* в папке Temporary Internet Files и найденные файлы добавляет в ListBox.
Но в результате она там ничего не находит.
А если подставить вместо Temporary Internet Files другую папку (обычную), то она выводит все файлы, т.е. в обычных папках всё нормально.
В чём проблема?
Mim1 (2004-09-19 09:41:00) [1]Может ничего не находит потому что они помечены скрытыми? Покажите как вы делали.
DiamondShark (2004-09-18 20:18:00) [2]Вообще-то, в папке Temporary Internet Files файлы есть. Вот только лежат они там не так, как показывает "Проводник".
begin...end (2004-09-18 20:04:00) [3]Да, uses ShlObj не забудь.
begin...end (2004-09-18 20:01:00) [4]Тебе ж статью посоветовали. Читать - влом, конечно?
Можно попробовать так (за правильность не ручаюсь):
function GetInternetTempPath: String;
var
Path: array [0..MAX_PATH] of Char;
PIDL: pItemIDList;
begin
Result := '';
SHGetSpecialFolderLocation(0, CSIDL_INTERNET_CACHE, PIDL);
if SHGetPathFromIDList(PIDL, Path) then
Result := String(Path);
end;
RoLeX2004 (2004-09-18 19:16:00) [5]Вот мне дали, но я не въехал:
procedure FindFilesByMask(List :tStrings; var DirCount :Integer; const DirName, Mask :String; SubDir: Boolean = True);
// Поиск файлов по маске в заданной папке и подпапке
//var
// num: Integer;
// Чем меньше параметров и локальных переменных у рекурсивной процедуры,
// тем меньше она требует памяти под стек. Поэтому использую локальную
// процедуру
procedure ScanDirs(const DirName :String);
var
h :tHandle;
wfd :tWin32FindData;
begin
Inc(DirCount); // просто для статистики
// Сначала просмотрим текущий каталог по заданной маске
h := Windows.FindFirstFile(PChar(DirName+Mask), wfd);
try
if h <> INVALID_HANDLE_VALUE then begin
repeat
if (wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
List.Add(DirName+wfd.cFileName);
until not Windows.FindNextFile(h,wfd);
end;
// проверка кода ошибки и FindFirstFile и FindNextFile
case GetLastError of
ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были)
ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске
ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
: ; // ничего не делаем, все Ok
else // все остальные ошибки
raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
end;
finally
if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h);
end;
// Теперь рекрсивно просмотрим подкаталоги
if not SubDir then exit; // 13.06.03
h := Windows.FindFirstFile(PChar(DirName+'*.*'), wfd);
try
if h <> INVALID_HANDLE_VALUE then begin
repeat
if ((wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) <> 0)
and (wfd.cFileName <> String('.'))
and (wfd.cFileName <> '..') then
ScanDirs(IncludeTrailingPathDelimiter(DirName+wfd.cFileName));
until not Windows.FindNextFile(h,wfd);
end;
// проверка кода ошибки и FindFirstFile и FindNextFile
case GetLastError of
ERROR_NO_MORE_FILES, // больше нет файлов и каталогов удовлетворяющих маске (но были)
ERROR_FILE_NOT_FOUND, // вообще нет файлов и каталогов удовлетворяющих маске
ERROR_SHARING_VIOLATION // возникает во время создания каталога (уже создан но еще недоступен)
: ; // ничего не делаем, все Ok
else // все остальные ошибки
raise Exception.CreateFmt('Ошибка просмотра каталога "%s": %s',[DirName,SysErrorMessage(GetLastError)]);
end;
finally
if h <> INVALID_HANDLE_VALUE then Windows.FindClose(h);
end;
end;
begin // FindFilesByMask
ScanDirs(IncludeTrailingPathDelimiter(DirName));
end;
RoLeX2004 (2004-09-18 17:38:00) [6]Ну всё-таки я не понял ничего. Как получит список файлов из Temporary Internet Files?
[lamer]Barmaglot (2004-09-18 15:58:00) [7]Поясняю, имена этих папок храняться в реестре... Твоя программа должна уметь их оттуда выценить, сходи по линку который я тебе дал, там приведен пример поисковой программы...
RoLeX2004 (2004-09-18 15:55:00) [8]И не только в этой папке, ещё и в History, C:\WINDOWS\Offline Web Pages, C:\WINDOWS\Downloaded Program Files...
[lamer]Barmaglot (2004-09-18 15:49:00) [9]Проблема в этой папке, имена там, насколько я помню, имеют ссылку на CLSID... Поэтому лучше забей на это, либо см. здесь: http://www.delphimaster.ru/articles/shell.html