Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.039 c
5-1110319178
Anwy
2005-03-09 00:59
2005.11.13
Компонент StringGrid


14-1129871656
Ega23
2005-10-21 09:14
2005.11.13
С днем рождения! 21 октября


1-1129883653
HF-Trade
2005-10-21 12:34
2005.11.13
Как отключить Таб ордер....


14-1129714217
Иксик
2005-10-19 13:30
2005.11.13
Горбачев посоветовал Америке "перестроиться"


8-1119515755
dtl
2005-06-23 12:35
2005.11.13
3d координатная сетка,повороты,масштабирование...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский