![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка 32 при вызове TFileStream [D5, Win2k]
man Yury © (2009-03-16 12:21:00)Добрый день.
Почему-то возникает ошибка 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-19 09:41:00) [1]Скачай с сайта microsoft Process Explorer (ссылку легко найти в Гугле). Там есть функция определения программы, захватившей файл (иконка с биноклем).
Тын-Дын (2009-03-18 20:24:00) [2]
> Все равно это надо будет реализовывать через потоки ...
> дело в том что перед началом обработки файла необходима
> 20 секундная задержка (пока "отпустит" программа, которая
> создала этот файл) ...
Так это не твоё приложение файл создаёт?
man Yury (2009-03-18 18:35:00) [3]Извиняюсь, был немного занят ...
Все равно это надо будет реализовывать через потоки ... дело в том что перед началом обработки файла необходима 20 секундная задержка (пока "отпустит" программа, которая создала этот файл) ...
поэтому я и недумаю что это решит мою проблему - subj ....
может есть средства узнать КАКОЙ процесс захватил файл ?
Тын-Дын (2009-03-17 23:40:00) [4]
> Сейчас просто стало 6 директориев -> 6 принтеров -> 6 экземпляров
> программ...
Может проще сделать одну программу, но в ней мониторить все каталоги, и иметь, соответственно, один файл протокола?
Тын-Дын (2009-03-17 23:38:00) [5]
> Кролик Иа-Иа © (17.03.09 19:34) [10]
> > Задача простая - мониторить определенные директории а
> что TShellChangeNotifier не в моде?
А что это такое в D5?
Игорь Шевченко (2009-03-17 22:35:00) [6]GetLastError к except имеет крайне опосредованное отношение. Можно даже сказать, что никакого отношения не имеет.
Кролик Иа-Иа (2009-03-17 19:34:00) [7]
> Задача простая - мониторить определенные директории
а что TShellChangeNotifier не в моде?
man Yury (2009-03-17 10:13:00) [8]Задача простая - мониторить определенные директории и при появлении в них файла проанализировать (кое-что "дорисовать",распечатать на нескольких страницах на определенном принтере). Чтоб упростить задачу была разработана программа, которая мониторит директорий и печатает на принтер, которые указаны в ini файле...
Сейчас просто стало 6 директориев -> 6 принтеров -> 6 экземпляров программ...
Тын-Дын (2009-03-17 01:08:00) [9]
> man Yury
НЕпонятна твоя задача.
но сильно кажется, что у тебя неправильное решение задачи.
man Yury (2009-03-16 20:16:00) [10]да вроде так и делаю ...
есть цикл который завершается есть экземпляр обьекта TFileStream создан без ошибки.
until LastError=0;
в конструкцииtry .. exceptпытаюсь создать TFileStream ... если в течении 4 раз экземпляр не создан - программа закрывается (просто в блокеexcept .. endприведен не весь код "закрытия" программы).
Просто не понятно что за процесс блокирует доступ к файлу ...
У меня работает 6 экземпляров данной программы - при помощи ini файла они "заточены" на мониторинг своего директория и вывод на свои принтер ...
В начале думал что "мои" программы не могут "поделить" файл - поэтому сделал через симафоры...а тут блин теряюсь в догадках ...
Palladin (2009-03-16 19:47:00) [11]
> man Yury (16.03.09 17:58) [5]
брр... основное правило блока except не допускать возникновения исключений... иначе потом костей не соберешь... в except нужно, если уж на то пошло, выставлять флаг ошибки, а действия, в этом окаянном случае, производить в основном try, естественно в except нужно анализировать вид исключения и корректно реагировать...
man Yury (2009-03-16 17:58:00) [12]А чем код не угодил то ?
В случае ошибки создания экземпляра TFileStream делаем Sleep 500 мс. если было уже 4 попытки то программа закрывается... и уничтожает что создавалось ручками .... - EXIT "пропал при копировании" -)))
Плохиш (2009-03-16 17:46:00) [13]
> man Yury (16.03.09 14:40) [3]
Это что за кода-испражнения в секции except нарисованы? Подумать над желаемым не судьба?
man Yury (2009-03-16 14:40:00) [14]> Плохиш
> 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 13:09:00) [15]
> 1) как узнать какой процесс не дает создать файл TFileStream;
Зачем?
> 2) как правильно сделать чтобы это все-таки работало
Подождать пока "другой процесс" освободит файл.
Медвежонок Пятачок (2009-03-16 12:56:00) [16]Почему-то возникает ошибка 32 - "процесс не может получить доступ к файлу, поскольку последний используется другим процессом".
Не почему-то а потому, что занят другим процессом.