Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 17:16   #1
Quadro_O
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 16
Смех Узнать, где открыт файл (Delphi)

Собственно где-то в программе открыт файл, и при выполнении цикла (на 2ом круге) вылезает ошибка I/O Error 32 (не отправляйте меня использовать поиск, я знаю, что это за ошибка ), т.к. программа не может перезаписать этот файл.

Можно ли узнать, где он открыт??

я так понимаю надо его закрыть через Closefile, но если файл не указан в FileHandle, то как его можно закрыть другими способами?
Выкладывать код не буду (не хочу, чтобы стащили ), да и там около 400 строк и полный беспорядок.

Сам файл используется в 2ух функциях, сколько я не смотрел на них, не могу найти, где ошибко )

Последний раз редактировалось Quadro_O; 05.05.2010 в 17:21.
Quadro_O вне форума Ответить с цитированием
Старый 05.05.2010, 18:02   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...а нам ваш 400-страничный код и не нужен ...ищите ошибку в той строке, где вы открыли файл
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 05.05.2010, 18:12   #3
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

А для кого существует обработка исключительных ситуаций???
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 05.05.2010, 18:12   #4
Quadro_O
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 16
По умолчанию

400-строчный. Он выдаёт ошибку на строке ReWrite, но это из-за того, что файл открыт в программе и не может быть перезаписан
2 Grag: Кого ? Что?

Последний раз редактировалось Quadro_O; 05.05.2010 в 18:15.
Quadro_O вне форума Ответить с цитированием
Старый 05.05.2010, 18:25   #5
Quadro_O
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 16
По умолчанию

Вот код, который отправляет капчу для распознания. Судя по всему он и занимает файл.

Код:
function recognize(filename: string; apikey: string; is_phrase: boolean; is_regsense: boolean; is_numeric: boolean; min_len: integer; max_len: integer): string;
var
ftype,tmpstr,captcha_id: String;
i: integer;
http: TIdHTTP;
multi: Tidmultipartformdatastream;
begin
if FileExists(filename)=false then begin result:='ERROR: file not found'; exit; end;

ftype:='image/pjpeg';
if strpos(Pchar(filename),'jpg')<>nil then ftype:='image/pjpeg';
if strpos(Pchar(filename),'gif')<>nil then ftype:='image/gif';
if strpos(Pchar(filename),'png')<>nil then ftype:='image/png';

multi:=Tidmultipartformdatastream.Create;
multi.AddFormField('method','post');
multi.AddFormField('key',apikey);
multi.AddFile('file',filename,ftype);
if is_phrase=true then multi.AddFormField('phrase','1');
if is_regsense=true then multi.AddFormField('regsense','1');
if is_numeric=true then multi.AddFormField('numeric','1');
if min_len>0 then multi.AddFormField('min_len',inttostr(min_len));
if max_len>0 then multi.AddFormField('max_len',inttostr(max_len));

http:=TIdHTTP.Create(nil);
tmpstr:=http.Post('http://antigate.com/in.php',multi);
http.Free;
captcha_id:='';
if strpos(Pchar(tmpstr),'ERROR_')<>nil then begin result:=tmpstr; exit; end;
if strpos(Pchar(tmpstr),'OK|')<>nil then captcha_id:=AnsiReplaceStr(tmpstr,'OK|','');
if captcha_id='' then result:='ERROR: bad captcha id';
for i:=0 to 20 do
  begin
  Application.ProcessMessages;
  sleep(5000);
  http:=TIdHttp.Create(nil);
  tmpstr:=http.Get('http://antigate.com/res.php?key='+apikey+'&action=get&id='+captcha_id);
  http.Free;
  if strpos(Pchar(tmpstr),'ERROR_')<>nil then begin result:=tmpstr; exit; end;
  if strpos(Pchar(tmpstr),'OK|')<>nil then
    begin
    result:=AnsiReplaceStr(tmpstr,'OK|','');
    exit;
    end;
  Application.ProcessMessages;
  end;
result:='ERROR_TIMEOUT';
end;

2ая функция: скачивание капчи

Код:
function GetInetFile (const fileURL, FileName: String): boolean;
const BufferSize = 1024;
var
  hSession, hURL: HInternet;
  Buffer: array[1..BufferSize] of Byte;
  BufferLen: DWORD;
  f: File;
  sAppName: String;
begin
  Result:=False;
  sAppName := ExtractFileName(Application.ExeName);
  hSession :=InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0);
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:=True;
    finally
      InternetCloseHandle(hURL)
    end
  finally
    InternetCloseHandle(hSession)
  end
end;
Quadro_O вне форума Ответить с цитированием
Старый 05.05.2010, 18:26   #6
Grag
А может и не...
Участник клуба
 
Аватар для Grag
 
Регистрация: 27.03.2010
Сообщений: 1,269
По умолчанию

Цитата:
Сообщение от Quadro_O Посмотреть сообщение
2 Grag: Кого ? Что?
Обработка исключительных ситуаций
Код:
try 
........
finally
........
end;

try
.........
except
.........
end;
Перемешивай дело с бездельем и не сойдешь с ума...
Grag вне форума Ответить с цитированием
Старый 05.05.2010, 19:54   #7
Quadro_O
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 16
По умолчанию

Опять извини за тупой вопрос: как это поможет?)
Quadro_O вне форума Ответить с цитированием
Старый 05.05.2010, 20:29   #8
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
как это поможет?)
Не будут вылетать ошибки.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 05.05.2010, 20:47   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Возможно во время repeat until ошибка возникает и программа сразу на finally идёт. Вот туда и надо закрытие файла прописать.
Код:
    try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      //CloseFile(f);
      Result:=True;
    finally
      CloseFile(f);
      InternetCloseHandle(hURL)
    end
eoln вне форума Ответить с цитированием
Старый 06.05.2010, 10:44   #10
Quadro_O
Пользователь
 
Регистрация: 21.04.2010
Сообщений: 16
По умолчанию

eoln не помогло
Quadro_O вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где узнать точные циферы? Utkin Свободное общение 23 25.12.2009 16:30
Открыт ли лоток CD-привода, Delphi kerevra Общие вопросы Delphi 3 11.12.2009 13:42
Как узнать, открыт ли файл? #32 Microsoft Office Excel 5 30.10.2009 12:04
Как узнать путь где щас мой exe zotox Помощь студентам 2 26.03.2009 23:38
Где узнать текущее разрешение экрана? Teksa Помощь студентам 2 07.09.2007 17:19