Конференция "Основная" » Ошибка 32 при вызове TFileStream [D5, Win2k]
 
  • man Yury (16.03.09 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)

    Заранее благодарен,
    Юрий
  • Медвежонок Пятачок © (16.03.09 12:56) [1]
    Почему-то возникает ошибка 32 - "процесс не может получить доступ к файлу, поскольку последний используется другим процессом".

    Не почему-то а потому, что занят другим процессом.
  • Плохиш © (16.03.09 13:09) [2]

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

    Зачем?

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

    Подождать пока "другой процесс" освободит файл.
  • man Yury (16.03.09 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) Зачем?
    Знать куда и как "копать"...
  • Плохиш © (16.03.09 17:46) [4]

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

    Это что за кода-испражнения в секции except нарисованы? Подумать над желаемым не судьба?
  • man Yury (16.03.09 17:58) [5]
    А чем код не угодил то ?
    В случае ошибки создания экземпляра TFileStream делаем Sleep 500 мс. если было уже 4 попытки то программа закрывается... и уничтожает что создавалось ручками .... - EXIT "пропал при копировании" -)))
  • Palladin © (16.03.09 19:47) [6]

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

    брр... основное правило блока except не допускать возникновения исключений... иначе потом костей не соберешь... в except нужно, если уж на то пошло, выставлять флаг ошибки, а действия, в этом окаянном случае, производить в основном try, естественно в except нужно анализировать вид исключения и корректно реагировать...
  • man Yury (16.03.09 20:16) [7]
    да вроде так и делаю ...
    есть цикл который завершается есть экземпляр обьекта TFileStream создан без ошибки.

    until LastError=0;


    в конструкции
    try .. except

    пытаюсь создать TFileStream ... если в течении 4 раз экземпляр не создан - программа закрывается (просто в блоке
    except .. end

    приведен не весь код "закрытия" программы).

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

    У меня работает 6 экземпляров данной программы - при помощи ini файла они "заточены" на мониторинг своего директория и вывод на свои принтер ...
    В начале думал что "мои" программы не могут "поделить" файл - поэтому сделал через симафоры...а тут блин теряюсь в догадках ...
  • Тын-Дын © (17.03.09 01:08) [8]

    > man Yury


    НЕпонятна твоя задача.
    но сильно кажется, что у тебя неправильное решение задачи.
  • man Yury (17.03.09 10:13) [9]
    Задача простая - мониторить определенные директории и при появлении в них файла проанализировать (кое-что "дорисовать",распечатать на нескольких страницах на определенном принтере). Чтоб упростить задачу была разработана программа, которая мониторит директорий и печатает на принтер, которые указаны в ini файле...
    Сейчас просто стало 6 директориев -> 6 принтеров -> 6 экземпляров программ...
  • Кролик Иа-Иа © (17.03.09 19:34) [10]

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

    а что TShellChangeNotifier не в моде?
  • Игорь Шевченко © (17.03.09 22:35) [11]
    GetLastError к except имеет крайне опосредованное отношение. Можно даже сказать, что никакого отношения не имеет.
  • Тын-Дын © (17.03.09 23:38) [12]

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


    А что это такое в D5?
  • Тын-Дын © (17.03.09 23:40) [13]

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


    Может проще сделать одну программу, но в ней мониторить все каталоги, и иметь, соответственно, один файл протокола?
  • man Yury (18.03.09 18:35) [14]
    Извиняюсь, был немного занят ...
    Все равно это надо будет реализовывать через потоки ... дело в том что перед началом обработки файла необходима 20 секундная задержка (пока "отпустит" программа, которая создала этот файл) ...
    поэтому я и недумаю что это решит мою проблему - subj ....

    может есть средства узнать КАКОЙ процесс захватил файл ?
  • Тын-Дын © (18.03.09 20:24) [15]

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


    Так это не твоё приложение файл создаёт?
  • Юрий Иванов (19.03.09 09:41) [16]
    Скачай с сайта microsoft Process Explorer (ссылку легко найти в Гугле). Там есть функция определения программы, захватившей файл (иконка с биноклем).
 
Конференция "Основная" » Ошибка 32 при вызове TFileStream [D5, Win2k]
Есть новые Нет новых   [118688   +17][b:0][p:0.018]