![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Функция показывает, что в папке Prefetch файлы в использовании! [D7, WinXP]
rolex © (2005-08-28 12:41:00)Использую следующую функцию, для определения в использовании файл или нет:
function ApplicationUse(fName: string): boolean;
var
HFileRes: HFILE;
begin
Result := false;
HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;
Нужно мне это для того, чтобы при удалении списка файлов (в корзину(!)) прога не подвисала, если файл нах-ся в использовании.
Функция работает отлично. Но когда дело доходит до файлов, находящихся в папке C:\WINDOWS\Prefetch, то функция показывает, что файлы используются.
Сначала я думал, что так оно и есть, пока не попробовал вручную удалить любой файл из этой папки. Файл спокойно удаляется.
Почему так и что мне делать?
Иванов (2005-09-12 10:01:00) [1]Не надо снимать атрибут. Достаточно проверять код возврата (GetLastError или в Delphi просто {$I-} i:=IOresult). Если он равен 2, то файл не найден. Можно также вместо попытки открыть файл использовать функцию Delphi FileAge - она возвращает -1 если файла нет. Для этой функции есть какой-то аналог в Win API. проще всего посмотреть ее исходник в Delphi Source.
psa247 (2005-09-11 18:09:00) [2]
> C:\WINDOWS\Prefetch, то функция показывает, что файлы используются.
Да, действительно. Иванов прав. Заметил, что на все системные папки Винда автоматически вешает атрибут ReadOnly (Даже если изменить, то в прошествии некоторого времени). Как выход - проверять и снимать атрибут.
psa247 (2005-09-10 13:30:00) [3]
procedure TF.Delete_Dir(Folder_Name : string);
var SR : TSearchRec;
Att : Word;
begin
// Удаляем содержимое каталога
Report.Lines.Add('Ищем в: '+ Folder_Name);
if FindFirst(Folder_Name +'\*.*', faAnyFile, SR)=0 then begin
repeat
if(SR.Name<>'.')and(SR.Name<>'..')then begin
Report.Lines.Add('Нашли: '+ SR.Name);
Report.Lines.Add('Атрибуты у: '+ SR.Name);
Att:= FileGetAttr(Folder_Name +'\'+ SR.Name);
if Att and faDirectory <>0 then Report.Lines.Add(' -faDirectory');
if Att and faReadOnly <>0 then Report.Lines.Add(' -faReadOnly');
if Att and faHidden <>0 then Report.Lines.Add(' -faHidden');
if Att and faSysFile <>0 then Report.Lines.Add(' -faSysFile');
if Att and faArchive <>0 then Report.Lines.Add(' -faArchive');
if Att and faReadOnly <>0 then begin
// Report.Lines.Add('Убираем атрибут "ReadOnly" у: '+ SR.Name);
if FileSetAttr(Folder_Name +'\'+ SR.Name, Att - faReadOnly)= 0 then
Report.Lines.Add('Атрибут "ReadOnly" у: '+ SR.Name + ' - Снят успешно')
else Report.Lines.Add('Не могу снять атрибут "ReadOnly" у: '+ SR.Name + ' - Код ошибки: '+ SysErrorMessage(GetLastError));
end;
if Att and faSysFile <>0 then begin
// Report.Lines.Add('Убираем атрибут "SysFile" у: '+ SR.Name);
if FileSetAttr(Folder_Name +'\'+ SR.Name, Att - faSysFile)= 0 then
Report.Lines.Add('Атрибут "SysFile" у: '+ SR.Name + ' - Снят успешно')
else Report.Lines.Add('Не могу снять атрибут "SysFile" у: '+ SR.Name + ' - Код ошибки: '+ SysErrorMessage(GetLastError));
end;
// Если это директория - вызываем рекурсию
if SR.Attr and faDirectory <>0 then begin
Report.Lines.Add(SR.Name +' - Директория, вызываем рекурсию');
Delete_Dir(Folder_Name +'\'+ SR.Name)
end
else begin
// Report.Lines.Add(SR.Name +' - Фаил');
if not(DeleteFile(Folder_Name +'\'+ SR.Name))then
Report.Lines.Add('Не могу удалить файл - '+ SR.Name + 'Код ошибки: '+ SysErrorMessage(GetLastError))
else Report.Lines.Add('Удален файл - '+ SR.Name);
end;
end;
until FindNext(SR)<>0;
end;
FindClose(SR);
Att:= FileGetAttr(Folder_Name);
Report.Lines.Add('Атрибуты у: '+ Folder_Name);
if Att and faReadOnly <>0 then begin
Report.Lines.Add('Снимаем атрибут "ReadOnly" у: '+ Folder_Name);
if FileSetAttr(Folder_Name +'\'+ SR.Name, Att - faReadOnly)=0 then
Report.Lines.Add('Атрибут "ReadOnly" у: '+ Folder_Name + ' - Снят успешно')
else Report.Lines.Add('Не могу снять атрибут "ReadOnly" у: '+ Folder_Name + ' - Код ошибки: '+SysErrorMessage(GetLastError));
end;
if Att and faSysFile <>0 then begin
Report.Lines.Add('Снимаем атрибут "faSysFile" у: '+ Folder_Name);
if FileSetAttr(Folder_Name +'\'+ SR.Name, Att - faSysFile)=0 then
Report.Lines.Add('Атрибут "faSysFile" у: '+ Folder_Name + ' - Снят успешно')
else Report.Lines.Add('Не могу снять атрибут "faSysFile" у: '+ Folder_Name + ' - Код ошибки: '+SysErrorMessage(GetLastError));
end;
// Удаляем саму директорию
Report.Lines.Add('Удаляем директорию: '+ Folder_Name);
if RemoveDir(Insert_Slashes(Folder_Name))then Report.Lines.Add(Folder_Name + ' - Удалена успешно')
else Report.Lines.Add('Не могу удалить '+ Folder_Name + ' - Код ошибки: '+ SysErrorMessage(GetLastError));
end;
Такая же беда.
> Иванов (07.09.05 09:44) [9]
Не помогает...
Иванов (2005-09-07 09:44:00) [4]Скорее всего, у Вас нет прав на запись в этой папке или файл имеет аттрибут ReadOnly, поэтому открыть его с GENERIC_WRITE не удается.
kami (2005-09-06 19:27:00) [5]код 5 означает: Access is denied. ERROR_ACCESS_DENIED (с) MSDN.
rolex (2005-09-06 19:08:00) [6]Ауу! Ответьте пожалуйста.
rolex (2005-08-31 10:13:00) [7]Вылезает ошибка:
System Error. Code: 5.
Отказано в доступе.
begin...end (2005-08-29 12:11:00) [8]> rolex (29.08.05 12:04) [4]
...
HFileRes := CreateFile(...);
Win32Check(HFileRes <> INVALID_HANDLE_VALUE);
...
rolex (2005-08-29 12:04:00) [9]А как проверить?
begin...end (2005-08-29 07:51:00) [10]> rolex (29.08.05 07:46) [2]
В смысле, GetLastError.
rolex (2005-08-29 07:46:00) [11]Всмысле код ошибки?
Anatoly Podgoretsky (2005-08-28 12:55:00) [12]Какой код ошибки