Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизФункция показывает, что в папке Prefetch файлы в использовании! Найти похожие ветки
← →
rolex (2005-08-28 12:41) [0]Использую следующую функцию, для определения в использовании файл или нет:
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, то функция показывает, что файлы используются.
Сначала я думал, что так оно и есть, пока не попробовал вручную удалить любой файл из этой папки. Файл спокойно удаляется.
Почему так и что мне делать?
← →
Anatoly Podgoretsky © (2005-08-28 12:55) [1]Какой код ошибки
← →
rolex (2005-08-29 07:46) [2]Всмысле код ошибки?
← →
begin...end © (2005-08-29 07:51) [3]> rolex (29.08.05 07:46) [2]
В смысле, GetLastError.
← →
rolex (2005-08-29 12:04) [4]А как проверить?
← →
begin...end © (2005-08-29 12:11) [5]> rolex (29.08.05 12:04) [4]
...
HFileRes := CreateFile(...);
Win32Check(HFileRes <> INVALID_HANDLE_VALUE);
...
← →
rolex (2005-08-31 10:13) [6]Вылезает ошибка:
System Error. Code: 5.
Отказано в доступе.
← →
rolex (2005-09-06 19:08) [7]Ауу! Ответьте пожалуйста.
← →
kami © (2005-09-06 19:27) [8]код 5 означает: Access is denied. ERROR_ACCESS_DENIED (с) MSDN.
← →
Иванов (2005-09-07 09:44) [9]Скорее всего, у Вас нет прав на запись в этой папке или файл имеет аттрибут ReadOnly, поэтому открыть его с GENERIC_WRITE не удается.
← →
psa247 © (2005-09-10 13:30) [10]
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]
Не помогает...
← →
psa247 © (2005-09-11 18:09) [11]
> C:\WINDOWS\Prefetch, то функция показывает, что файлы используются.
Да, действительно. Иванов прав. Заметил, что на все системные папки Винда автоматически вешает атрибут ReadOnly (Даже если изменить, то в прошествии некоторого времени). Как выход - проверять и снимать атрибут.
← →
Иванов (2005-09-12 10:01) [12]Не надо снимать атрибут. Достаточно проверять код возврата (GetLastError или в Delphi просто {$I-} i:=IOresult). Если он равен 2, то файл не найден. Можно также вместо попытки открыть файл использовать функцию Delphi FileAge - она возвращает -1 если файла нет. Для этой функции есть какой-то аналог в Win API. проще всего посмотреть ее исходник в Delphi Source.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.034 c