Давно написал. И вот решил выложить на общий обзор. Программа предназначена для лечения кривых и не докаченных отчетов от Пинча, которые парсер не может прочитать. Использование программы: Первый вариант: pld.exe -d [-o] in_dir_name [out_dir_name] где in_dir_name - путь к папке с кривыми отчетами out_dir_name - путь к папке в которую будут кидаться излеченные отчеты, если не указать этот параметр, то излеченные файлы будут находиться в папке с кривыми отчетами. -o - не обязательный параметр. При его использовании удаляется модуль содержащий отчеты из Оперы(очень часто они бывают ошибочными) Если путь содержит пробелы то необходимо взять его в ковычки. При таком варианте использования будут обработаны все файлы с расширением *.err в папке dir_name. Исправленные файлы будут иметь имя - file_name.err.pld Пример: pld.exe -d c:\pinch\log\Malformed\ pld.exe -d "c:\my pinchlog\Malformed\" pld.exe -d -o c:\pinch\log\Malformed\ c:\norm\ Второй вариант: pld.exe [-o] file_name где file_in - имя файла требующего лечения. Если путь или имя содержат пробелы то необходимо взять его в ковычки. При таком варианте использования будет обработан только один входной файл. Исправленный файл будут иметь имя - file_name.pld Пример: pld.exe c:\pinch\log\Malformed\12E0AB4578.err pld.exe -o "c:\my pinchlog\log\Malformed\12E0AB4578.err" P.S. Кривые отчеты парсер хранит в папке Malformed Лечение недокаченных отчетов происходит следующим образом: Отрезаются целые модули и к ним прибавляется код говоряший парсеру о конце файла Исходник можно замодить и под выделение отдельных модулей из отчета, увы таблицы модулей ненашел, а то можно былобы и реализовать. Code: program pld_v2; {$APPTYPE CONSOLE} uses windows; type Tlogs=packed record magic:array[0..3] of char; id:LongWord; size:LongWord; end; var opera_del:boolean=false; function fileexists(s:string):boolean; var FindData:TWin32FindData; Handle:integer; begin Handle:=FindFirstFile(PChar(s),FindData); if Handle<0 then result:=false else result:=true; end; function Str2DW(s:string):dword; begin result:=ord(s[5])+ord(s[6]) shl 8+ord(s[7])shl 16+ord(s[8]) shl 24 ; end; function doctor(file_in,file_out:string):integer; var f_in,f_out:thandle; logs:Tlogs; rb:cardinal; file_size:dword; block:string; rec:string; rec_size:dword; const P3ML='P3ML'; begin result:=1; f_in:=CreateFile(PChar(file_in), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if f_in=INVALID_HANDLE_VALUE then exit; file_size:=GetFileSize(f_in,nil); setlength(block,file_size); ReadFile(f_in, block[1], file_size, rb, nil); CloseHandle(f_in); if rb<>file_size then begin setlength(block,0); inc(result); exit; end; if copy(block,1,4)<>'P3ML' then begin setlength(block,0); inc(result); exit; end; inc(result); f_out:=CreateFile(PChar(file_out), GENERIC_READ or GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if f_out=INVALID_HANDLE_VALUE then exit; delete(block,1,4); while pos('P3ML',block)<>0 do begin rec:=copy(block,1,pos('P3ML',block)+3); if length(rec)<12 then begin Delete(block,1,length(rec)); continue; end; rec_size:=Str2DW(rec); if (rec_size=length(rec)-8) then begin if (opera_del=true) and (rec[1]=#$0F) then begin Delete(block,1,length(rec)); continue; end; WriteFile(f_out, P3ML, 4,rb, nil); WriteFile(f_out, rec[1], length(rec)-4,rb, nil); end; Delete(block,1,length(rec)); end; logs.magic:=P3ML; logs.id:=$FFFFFFFF; logs.size:=0; WriteFile(f_out, logs, 12,rb, nil); CloseHandle(f_out); result:=0; end; function GetSmallName(s:string):string; begin while pos('\',s)<>0 do delete(s,1,pos('\',s)); result:=s; end; var fd:_WIN32_FIND_DATAA; fh:dword; out_dir:string; param:integer; begin writeln('Pinch Log Doctor (C) SLESH 2008'); writeln('E-MAIL: SLESH-2000@mail.ru'); writeln('ICQ: 266-334-734'); writeln('WMZ: Z671833489051'); writeln('WMR: R156568501269'); param:=1; if (paramstr(param)='') then begin writeln(#13#10'Usage: pld.exe -d -o in_dir_name [out_dir_name] - All *.err file'); writeln(' pld.exe -o file_in - One file'); writeln('-o Delete Opera Module'); exit; end; if paramstr(param)='-d' then begin inc(param); if paramstr(param)='-o' then begin opera_del:=true; inc(param); end; if (paramstr(param)='') then begin writeln(#13#10'Usage: pld.exe -d in_dir_name [out_dir_name]- All *.err file'); writeln(' pld.exe file_in - One file'); exit; end; out_dir:=paramstr(param+1); if out_dir='' then out_dir:=paramstr(param); writeln; fh:=FindFirstFile(pchar(paramstr(param)+'\*.err'),fd); if fh=INVALID_HANDLE_VALUE then exit; repeat write(GetSmallName(fd.cFileName)+' '); case doctor(paramstr(param)+'\'+fd.cFileName,out_dir+'\'+fd.cFileName+'.pld') of 1:writeln('[-] Can not open input file'); 2:writeln('[-] Can not read input file'); 3:writeln('[-] Can not correct'); 4:writeln('[-] Can not create output file'); 0:writeln('[+] Report is corrected successfully'); end; until FindNextFile(fh,fd)=false; exit; end; if paramstr(param)='-o' then begin opera_del:=true; inc(param); end; if not fileexists(paramstr(param)) then begin writeln(#13#10'[-] Error: input file not found'); exit; end; deletefile(pchar(paramstr(1)+'.pld')); case doctor(paramstr(param),paramstr(param)+'.pld') of 1:writeln(#13#10'[-] Can not open input file'); 2:writeln(#13#10'[-] Can not read input file'); 3:writeln(#13#10'[-] Can not correct'); 4:writeln(#13#10'[-] Can not create output file'); 0:writeln(#13#10'[+] Report is corrected successfully'); end; end.
+++! Спасибо за утилиту, излечила все Malformed-отчеты для Parser2.3.1.8 Вот бы еще такую же для 2.2.2.2