Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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

Какой код ошибки


Наверх

Титульная страница Поиск, карта сайта Написать письмо