Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Функция показывает, что в папке 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 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.044 c
3-1128039182
DimonS
2005-09-30 04:13
2005.11.13
Как запретить вставку пустой строки?


14-1129812134
TButton
2005-10-20 16:42
2005.11.13
притёр


4-1126204799
alexa
2005-09-08 22:39
2005.11.13
DlgDirList


4-1124626634
Proger121
2005-08-21 16:17
2005.11.13
Программатор SEEPROM для серии 93Сxx


2-1129793263
chili
2005-10-20 11:27
2005.11.13
Асоциативный масив с именами полей как сделать