Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1163158882
koha
2006-11-10 14:41
2006.12.03
Требуется ваше мнение: Что мешает программе запуститься?


4-1153468924
Lagrima_JN
2006-07-21 12:02
2006.12.03
Как определить, что эл. питание отсутствует?


2-1163613056
nordic3
2006-11-15 20:50
2006.12.03
Значок пи


1-1161708596
carmen
2006-10-24 20:49
2006.12.03
Создание dbgrideh на листе tabsheet компонента pagecontrol


2-1163780750
Golikov
2006-11-17 19:25
2006.12.03
как перевести строку в ASCII-код ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский