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

Вниз

Ошибка 32 при вызове TFileStream   Найти похожие ветки 

 
man Yury   (2009-03-16 12:21) [0]

Добрый день.

Почему-то возникает ошибка 32 - "процесс не может получить доступ к файлу, поскольку последний используется другим процессом".

Есть такая задача - мониторить директорий, при появлении файла - файл проанализировать, подредактировать и распечатать (из одного файла может быть несколько заданий для печати)
Работает вроде все нормально до распечатать (пишу лог работы программы...)
печатаю я через спулер на принтер :

if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
if not AddJob(FPrinterHandle,1,FJob,1024,pcbNeeded) then
  WriteLogString("Critical error! Function AddJob finished with result "+IntToStr(GetLastError)+ReturnOnNewString);

Stream:=TFileStream.Create(FJob^.Path,fmCreate or fmShareDenyNone);
  except
     LastError:=GetLastError;
     WriteLogString("Critical error create TFileStream object "+IntToStr(LastError)+" file name "+ FJob^.Path+ReturnOnNewString);
....
  end;
...
ScheduleJob(FPrinterHandle,FJob^.JobID);
...

Одновреммено запущено несколько экземпляров данной программы , т.к. мониторятся несколько директорий и каждая печатает на "своем" принтере поэтому введены семафоры (в начале было подозрения, что программы пытаются одновременно создать файл в спулере печати и из-за этого возникает ошибка).
Поэтому у меня вопросы :
1) как узнать какой процесс не дает создать файл TFileStream;
2) как правильно сделать чтобы это все-таки работало (
необходимо чтобы это работало под всеми OS Windows)

Заранее благодарен,
Юрий


 
Медвежонок Пятачок ©   (2009-03-16 12:56) [1]

Почему-то возникает ошибка 32 - "процесс не может получить доступ к файлу, поскольку последний используется другим процессом".

Не почему-то а потому, что занят другим процессом.


 
Плохиш ©   (2009-03-16 13:09) [2]


> 1) как узнать какой процесс не дает создать файл TFileStream;

Зачем?

> 2) как правильно сделать чтобы это все-таки работало

Подождать пока "другой процесс" освободит файл.


 
man Yury   (2009-03-16 14:40) [3]

> Плохиш

> 2)Подождать пока "другой процесс" освободит файл.

да пытаюсь подождать

CountAttempt:=0;
repeat
 try
   LastError:=0;
   Windows.sleep(100);
   Stream:=TFileStream.Create(FJob^.Path,fmCreate or fmShareDenyNone);
 except
   LastError:=GetLastError;
   WriteLogString("Critical error create TFileStream object "+IntToStr(LastError)+" file name "+ FJob^.Path+ReturnOnNewString);
   inc(CountAttempt,1);
   if CountAttempt>4 then
     begin
       CloseHandle(hMutex);
       Stream.Free;
       SysUtils.FindClose(SearchEndLog);
       System.CloseFile(FileLog);
     end
   else
     Windows.sleep(500);
 end
until LastError=0;


но толку мало...

>1) Зачем?
Знать куда и как "копать"...


 
Плохиш ©   (2009-03-16 17:46) [4]


> man Yury   (16.03.09 14:40) [3]

Это что за кода-испражнения в секции except нарисованы? Подумать над желаемым не судьба?


 
man Yury   (2009-03-16 17:58) [5]

А чем код не угодил то ?
В случае ошибки создания экземпляра TFileStream делаем Sleep 500 мс. если было уже 4 попытки то программа закрывается... и уничтожает что создавалось ручками .... - EXIT "пропал при копировании" -)))


 
Palladin ©   (2009-03-16 19:47) [6]


> man Yury   (16.03.09 17:58) [5]

брр... основное правило блока except не допускать возникновения исключений... иначе потом костей не соберешь... в except нужно, если уж на то пошло, выставлять флаг ошибки, а действия, в этом окаянном случае, производить в основном try, естественно в except нужно анализировать вид исключения и корректно реагировать...


 
man Yury   (2009-03-16 20:16) [7]

да вроде так и делаю ...
есть цикл который завершается есть экземпляр обьекта TFileStream создан без ошибки.

until LastError=0;
в конструкции try .. except пытаюсь создать TFileStream ... если в течении 4 раз экземпляр не создан - программа закрывается (просто в блоке except .. end приведен не весь код "закрытия" программы).

Просто не понятно что за процесс блокирует доступ к файлу ...

У меня работает 6 экземпляров данной программы - при помощи ini файла они "заточены" на мониторинг своего директория и вывод на свои принтер ...
В начале думал что "мои" программы не могут "поделить" файл - поэтому сделал через симафоры...а тут блин теряюсь в догадках ...


 
Тын-Дын ©   (2009-03-17 01:08) [8]


> man Yury


НЕпонятна твоя задача.
но сильно кажется, что у тебя неправильное решение задачи.


 
man Yury   (2009-03-17 10:13) [9]

Задача простая - мониторить определенные директории и при появлении в них файла проанализировать (кое-что "дорисовать",распечатать на нескольких страницах на определенном принтере). Чтоб упростить задачу была разработана программа, которая мониторит директорий и печатает на принтер, которые указаны в ini файле...
Сейчас просто стало 6 директориев -> 6 принтеров -> 6 экземпляров программ...


 
Кролик Иа-Иа ©   (2009-03-17 19:34) [10]


> Задача простая - мониторить определенные директории

а что TShellChangeNotifier не в моде?


 
Игорь Шевченко ©   (2009-03-17 22:35) [11]

GetLastError к except имеет крайне опосредованное отношение. Можно даже сказать, что никакого отношения не имеет.


 
Тын-Дын ©   (2009-03-17 23:38) [12]


> Кролик Иа-Иа ©   (17.03.09 19:34) [10]
> > Задача простая - мониторить определенные директории а
> что TShellChangeNotifier не в моде?


А что это такое в D5?


 
Тын-Дын ©   (2009-03-17 23:40) [13]


> Сейчас просто стало 6 директориев -> 6 принтеров -> 6 экземпляров
> программ...


Может проще сделать одну программу, но в ней мониторить все каталоги, и иметь, соответственно, один файл протокола?


 
man Yury   (2009-03-18 18:35) [14]

Извиняюсь, был немного занят ...
Все равно это надо будет реализовывать через потоки ... дело в том что перед началом обработки файла необходима 20 секундная задержка (пока "отпустит" программа, которая создала этот файл) ...
поэтому я и недумаю что это решит мою проблему - subj ....

может есть средства узнать КАКОЙ процесс захватил файл ?


 
Тын-Дын ©   (2009-03-18 20:24) [15]


> Все равно это надо будет реализовывать через потоки ...
> дело в том что перед началом обработки файла необходима
> 20 секундная задержка (пока "отпустит" программа, которая
> создала этот файл) ...


Так это не твоё приложение файл создаёт?


 
Юрий Иванов   (2009-03-19 09:41) [16]

Скачай с сайта microsoft Process Explorer (ссылку легко найти в Гугле). Там есть функция определения программы, захватившей файл (иконка с биноклем).



Страницы: 1 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.011 c
4-1228230166
Kirill
2008-12-02 18:02
2010.02.14
Windows-аутентификация в совей программе


8-1202838536
SSW
2008-02-12 20:48
2010.02.14
Проблема с back буфером в direct3d


2-1260715573
Нагуглить_не_смог
2009-12-13 17:46
2010.02.14
UTF-8 -> ANSI


15-1260264866
Гипербореец
2009-12-08 12:34
2010.02.14
Аналог Application.ProcessMessages для С#


15-1259953459
KilkennyCat
2009-12-04 22:04
2010.02.14
какую библиотеку Ajax предпочитаете?