Форум: "WinAPI";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
ВнизФаил index.dat и explorer Найти похожие ветки
← →
Destroyer © (2006-07-21 19:22) [0]Пишу программу, которая по нажатию одной кнопки должна очистить все, что мне надо (несколько ключей в реестре, hystory и т.д.)
Нужно очистить посещеные адреса, которые записаны в internet explorer-e. Есть в реестре ключ - TypedURLs, в нем хранятся эти пути. Но, еще еи пути хранятся в файле index.dat в папке Documents and Settings\user\Local Settings\Temporary Internet Files\Content.IE5
Этот фаил постоянно занят и его нельзя удалить. Зато из эксплорера (проводника) можно зайти в папку Temporary Internet Files и увидеть прямо в нем содержимое файла index.dat, оттуда можно удалять всё что угодно.
Вопрос, как осуществить это программно? Может есть API функция специальная?
Варианты: последовательно нажимать кнопки программно и устанавливать драйвер чтобы удалять занятые файлы не подходят.
← →
KilkennyCat © (2006-07-21 21:42) [1]Работа с данным файлом ведется при помощи URLCACHEAPI
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/geturlcacheentryinfoex.asp
← →
Destroyer © (2006-07-22 10:57) [2]Спасибо!
Такой вопрос. Надо очистить все что там есть. Т.е. получать каждую запись
(geturlcacheentryinfoex), а затем удалять (DeleteUrlCacheEntry). Или можно как-то по другому?
И еще. Эта функция работает с index.dat в Temporary Internet Files, а еще есть файлы index.dat, в которых похожая информация в папках Cookies и еще примерно местах в 4х. Как работать с ними?
← →
KilkennyCat © (2006-07-22 11:31) [3]Думаю, надо работать с FindFirstUrlCasheEntry или FindFirstUrlCasheGroup,
FindNextUrlCasheEntry и удалять. Получать необходимо, если прочитать ее хотите.
По поводу других файлов: посмотрите их содержимое. В заголовке файла наверняка будет описание. Именно так я нашел ответ на Ваш вопрос.
← →
KilkennyCat © (2006-07-22 11:39) [4]Вот, кстати, если почитать описание:
FindFirstUrlCacheEntry
Begins the enumeration of the Internet cache.
HANDLE FindFirstUrlCacheEntry(
LPCTSTR lpszUrlSearchPattern <>,
LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo <>,
LPDWORD lpcbCacheEntryInfo <>
);
Parameters
lpszUrlSearchPattern
[in] A pointer to a string that contains the source name pattern to search for. This parameter can only be set to "cookie:", "visited:", or NULL. Set this parameter to "cookie:" to enumerate the cookies or "visited:" to enumerate the URL History entries in the cache. If this parameter is NULL, FindFirstUrlCacheEntry returns all content entries in the cache.
lpFirstCacheEntryInfo
[out] Pointer to an INTERNET_CACHE_ENTRY_INFO <internet_cache_entry_info.asp> structure.
lpcbCacheEntryInfo
[in, out] Pointer to a variable that specifies the size of the lpFirstCacheEntryInfo buffer, in TCHARs. When the function returns, the variable contains the number of TCHARs copied to the buffer, or the required size needed to retrieve the cache entry, in TCHARs.
Return Values
← →
Destroyer © (2006-07-22 18:13) [5]Еще раз спасибо, но я не очень понял, что значит
> По поводу других файлов: посмотрите их содержимое. В заголовке
> файла наверняка будет описание
Прямо в этих файлах index.dat?
Делаю вот так:
var
info : PInternetCacheEntryInfoA;
b: PDword;
t: string;
ninfo: PInternetCacheEntryInfoA;
buf: PDWORD;
adr: Cardinal;
begin
adr:=FindFirstUrlCacheEntryEx(nil,0,0,0,info,b,nil,nil,nil);
if (info <> nil) then
begin
repeat
t:= info.lpszSourceUrlName;
until FindNextUrlCacheEntryEx(adr,ninfo,buf,nil,nil,nil) = true;
end;
в t постоянно одно и тоже значение, но видимо, это неудивительно, т.к. значение adr всегда ноль.
А там должно быть
Handle returned by FindFirstUrlCacheEntryEx, which started a cache enumeration
Т.е. неправильно получаем хэндл. . Как правильно использовать эти функции?
← →
KilkennyCat © (2006-07-22 23:38) [6]http://delphimaster.net/view/6-1130745388/
← →
Destroyer © (2006-07-23 19:44) [7]Нашел/подправил в инете вот такой код. Он ищет и удаляет почти все что нужно. Но, в хэлпе написан, если указать NULL (If this parameter is NULL, FindFirstUrlCacheEntry returns all content entries in the cache. ), то вернет все значения. Да, возвращает все, а вот удаляются все, кроме "visited:". Пробовал выбирать только "visited:", выбираются, но не удаляются. В чем тут может быть проблема?
var
lpEntryInfo : PInternetCacheEntryInfo;
hCacheDir : LongWord;
dwEntrySize : LongWord;
dwLastError : LongWord;
begin
dwEntrySize := 0;
FindFirstUrlCacheEntry( NIL, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );
GetMem( lpEntryInfo, dwEntrySize );
Try
hCacheDir := FindFirstUrlCacheEntry( NIL, lpEntryInfo^, dwEntrySize );
If ( hCacheDir <> 0 ) Then
DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName )
Else
Exit;
Finally
FreeMem( lpEntryInfo );
End;
try
Repeat
dwEntrySize := 0;
FindNextUrlCacheEntry( hCacheDir, TInternetCacheEntryInfo( NIL^ ), dwEntrySize );
dwLastError := GetLastError();
If ( dwLastError = ERROR_INSUFFICIENT_BUFFER ) Then Begin
GetMem( lpEntryInfo, dwEntrySize );
If ( FindNextUrlCacheEntry( hCacheDir, lpEntryInfo^, dwEntrySize ) ) Then
DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
FreeMem(lpEntryInfo);
End;
Until ( dwLastError = ERROR_NO_MORE_ITEMS );
Finally
FindCloseUrlCache( hCacheDir );
End;
end;
← →
KilkennyCat © (2006-07-23 20:01) [8]Честно скажу - не знаю... Может, они открыты всегда?
← →
Destroyer © (2006-07-23 21:00) [9]Вот, кажется нашел в чем проблема. С помощью GetLastError();
Дело в том, что записи (entry) выглядят так:
http://isuas.nkosino.ru/zagotovka_files/top.gif
Cookie:sergey@isuas.nkosino.ru/
Visited: Sergey@http://csmania.ru/forum/search.php?mode=results
Тут 3 типа, как описано в хэлпе: http - ссылка, cookie: и visited:
Вот в ссылке и куки нет пробелов в строке, а в visited: есть пробел и ошибка возвращается - not found, короче не находит такую ссылку.
Есть функция
BOOLAPI UnlockUrlCacheEntryFile(
LPCTSTR lpszUrlName,
DWORD dwReserved
);
lpszUrlName
[in] Pointer to a null-terminated string that specifies the source name of the cache entry that is being unlocked. The name string should not contain any escape characters.
dwReserved
[in] Reserved. Must be zero.
Тут не должно быть нулей - концов строк, а пробел походу им мешает всему делу. Как обойти этот пробел?
← →
Destroyer © (2006-07-23 22:32) [10]Поправка: часть "visited:" стирается (та, что в файле index.dat в Temporary Internet Files), а часть остается в index.dat (в History - History.IE5)
Проблема теперь в том, как оттуда удалить.
← →
KilkennyCat © (2006-07-24 00:13) [11]Может быть из-за того, что в History группы?
← →
Destroyer © (2006-07-24 13:09) [12]Интересная идея, хотел попробовать, но нет функции FindFirstUrlCacheGroup. Как еще можно найти группы?
← →
Destroyer © (2006-07-24 15:12) [13]Нашел компонент (IECache) с этой функцией. Применил. Групп нет. С компонентом идет демо, там есть возможность очистить кэш (как раз то что нужно), но там точно такая же проблема - не удаляются часть visited: из history.ie5
Жду предложений.
← →
KilkennyCat © (2006-07-24 16:39) [14]> но нет функции FindFirstUrlCacheGroup.
Как это нет?! Есть...
← →
Destroyer © (2006-07-24 18:03) [15]
> Как это нет?! Есть...
В WinInet такой функции нет. Странно. Но это уже не важно, т.к. групп нет. А записи всеравно не удаляются. Они находятся фунциями FindFirstUrlCacheEntry и FindNextUrlCacheEntry, но не удаляются DeleteUrlCacheEntry. GetLastError выдает access denied.
Пробовал функцию UnlockUrlCacheEntryFile, но GetLastError после нее выдает
ERROR_FILE_NOT_FOUND
Вот так.
Вот код:dwEntrySize := 0;
FindFirstUrlCacheEntry( "visited:", TInternetCacheEntryInfo( NIL^ ), dwEntrySize );
GetMem( lpEntryInfo, dwEntrySize );
Try
hCacheDir := FindFirstUrlCacheEntry( "visited:", lpEntryInfo^, dwEntrySize );
If ( hCacheDir <> 0 ) Then
begin
UnlockUrlCacheEntryFile(lpEntryInfo^.lpszSourceUrlName,0);
dwLastError := GetLastError();
if (dwLastError = ERROR_FILE_NOT_FOUND) then
begin
showmessage("ERROR_FILE_NOT_FOUND");
end;
DeleteUrlCacheEntry( lpEntryInfo^.lpszSourceUrlName );
dwLastError := GetLastError();
if (dwLastError = ERROR_ACCESS_DENIED) then
begin
showmessage("ACCESS_DENIED");
end;
if (dwLastError = ERROR_FILE_NOT_FOUND) then
begin
showmessage("FILE_NOT_FOUND");
end;
end
Else
Exit;
Finally
FreeMem( lpEntryInfo );
End;
Жду предложений
← →
KilkennyCat © (2006-07-24 19:50) [16]
FindFirstUrlCacheGroup
Initiates the enumeration of the cache groups in the Internet cache.
HANDLE FindFirstUrlCacheGroup(
DWORD dwFlags,
DWORD dwFilter,
LPVOID lpSearchCondition,
DWORD dwSearchCondition,
GROUPID* lpGroupId,
LPVOID lpReserved
);
Parameters
dwFlags
[in] Reserved. Must be zero.
dwFilter
[in] Filters to be used. This parameter can be zero or one of the following values.Value Meaning
CACHEGROUP_SEARCH_ALL Search all cache groups.
CACHEGROUP_SEARCH_BYURL Not currently implemented.
lpSearchCondition
[in] Reserved. Must be NULL.
dwSearchCondition
[in] Reserved. Must be zero.
lpGroupId
[out] Pointer to the ID of the first cache group that matches the search criteria.
lpReserved
[in, out] Reserved. Must be NULL.
Return Values
Returns a valid handle to the first item in the enumeration if successful, or NULL otherwise. To get specific error information, call GetLastError. If the function finds no matching files, GetLastError returns ERROR_NO_MORE_FILES.
Функция есть...
Но, раз она не нужна, то не нужна...
Насколько я понимаю, UnlockUrlCacheEntryFile можно использовать только для своих записей, т.е. которые наше приложение залочило, а не Виндоуз. Из этого могу сделать вывод, что утилита несколько сложнее будет: скорее всего, записи можно будет удалить лишь в момент загрузки ОС (как, например, всякие чекдиски, партитионманагеры и т.д.)
← →
KilkennyCat © (2006-07-24 19:56) [17]И предложу метод тыка, на всякий случай... а попробуйте самостоятельно убить пробел. Может, это ошибка длл при получении непосредственно для visited
← →
Destroyer © (2006-07-25 21:43) [18]Пробел убивал из отладчика, просто стирал его, и такая же ерунда получалась. Вообще странно, возможно они и в правду заняты и поэтому не удаляются. Перезагрузка - да, буду пробовать, но нужно без нее. Может еще есть выход...
← →
Destroyer © (2006-07-26 23:45) [19]Обнаружил оч. интересный эффект. На сайте микрософта нашел утилиту для очистки кэша. Скачал, но она у меня не устанавилась. На др. компьютере - все ок, уставновилась и всё очистила! Еще на одном тоже не установилась, и там тоже были нестираемые записи. Нашел все на томже микрософтовском сайте инфу про файлы index.dat. Они говорят, что если вдруг файлы повредились, т.к. их неудалить из под винды, надо зайти либо в другую админскую уч. запись, либо из под доса стереть. (вообще придумали). В общем стер я эти индекс даты батником через ключ реестра RunOnce, нестираемые пропали, теперь стираются все. Тутилита теперь ставится. Я делаю вывод, что эти файлы, как они говорят, были повреждены. Но это не единичный случай, т.к. на др. компьютерах тоже такие записи есть. Пока без перезагрузки полностью очистить кэш не удаётся.
← →
KilkennyCat © (2006-07-26 23:54) [20]Ну что ж, значит, придется делать анализ, и соответственно, уведомлять пользователя, что фигня вышла, перезагрузка нужна...
Однако, забавно, что они повреждаются...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.048 c