Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.14;
Скачать: [xml.tar.bz2];

Вниз

Ошибка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.006 c
15-1260285232
vajo
2009-12-08 18:13
2010.02.14
Где находятся данные пользоватей в W2008?


1-1238073068
Afonya
2009-03-26 16:11
2010.02.14
ошибка при передаче формальных параметров


1-1237817783
Дмитрий Белькевич
2009-03-23 17:16
2010.02.14
SHBrowseForFolder открывается пустым


6-1212475055
ketovchanin
2008-06-03 10:37
2010.02.14
Proxy-Authorization


2-1260872714
Андрей_11
2009-12-15 13:25
2010.02.14
Combobox





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