Diff
checker
텍스트
텍스트
이미지
문서
Excel
폴더
Legal
Enterprise
데스크톱
요금제
로그인
데스크톱 앱 다운로드
텍스트 비교
두 텍스트 파일의 차이점을 찾아보세요
도구
기록
표시
레이아웃
나란히 보기
합쳐 보기
실시간 편집
공백 변경 숨기기
변경 없는 행 숨기기
줄바꿈 비활성화
비교 단위
스마트
구문
없음
모양 변경
처리
제외
텍스트 변환
첫 변경으로
수정
Diffchecker Desktop
가장 안전하게 Diffchecker를 사용하는 방법. 데스크톱 앱을 사용하면 비교 데이터가 외부로 전송되지 않습니다!
데스크톱 앱 받기
Untitled diff
생성일
9년 전
비교 결과 만료 없음
초기화
내보내기
공유
설명
139 삭제
행
총
삭제
글자
총
삭제
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
110 행
복사
120 추가
행
총
추가
글자
총
추가
이 기능을 계속 사용하려면 업그레이드해 주세요
Diff
checker
Pro
요금제 보기
82 행
복사
복사
복사됨
복사
복사됨
f
unction
internalRuncommand(p:TProcess;
var
outputstring:string;
F
unction
ReadInputPipe(const Pipe: TInputPipeStream;
var
BytesRead,OutputLen: integer;
var
OutputString:
string
): Boolean
;
var
stderrstring:
string
; var exitstatus:integer):integer
;
var
var
numbytes,bytesread,
available : integer;
available : integer;
outputlength, stderrlength : integer;
NumBytes
: integer;
stderrnumbytes,stderrbytesread
: integer;
begin
begin
r
esult
:=-1;
R
esult
:= False; available := 0;
if(BytesRead<0)then BytesRead := 0;
if(OutputLen<0)then OutputLen := 0;
repeat
if(Pipe=nil)then exit;
if(Pipe.NumBytesAvailable>0)
then available := Pipe.NumBytesAvailable
else break;
if(BytesRead+available>OutputLen)then
begin
OutputLen := BytesRead+READ_BYTES;
SetLength(OutputString,OutputLen);
end;
try
try
try
try
p.Options := [poUsePipes];
NumBytes :=
Pipe
.Read(
O
utput
S
tring[1+
B
ytes
R
ead], available);
bytesread:=0;
if
(
NumBytes
>0)
outputlength:=0;
then
Inc(BytesRead, NumBytes);
stderrbytesread:=0;
except
stderrlength:=0;
Result := False;
p.Execute;
while p.Running do
begin
// Only call ReadFromStream if Data from corresponding stream
// is already available, otherwise, on linux, the read call
// is blocking, and thus it is not possible to be sure to handle
// big data amounts bboth on output and stderr pipes. PM.
available:=P.Output.NumBytesAvailable;
if available > 0 then
begin
if (BytesRead + available > outputlength) then
begin
outputlength:=BytesRead + READ_BYTES;
Setlength(outputstring,outputlength);
end;
NumBytes :=
p.Output
.Read(
o
utput
s
tring[1+
b
ytes
r
ead], available);
if
NumBytes
> 0 then
Inc(BytesRead, NumBytes);
end
// The check for assigned(P.stderr) is mainly here so that
// if we use poStderrToOutput in p.Options, we do not access invalid memory.
else if assigned(P.stderr) and (P.StdErr.NumBytesAvailable > 0) then
begin
available:=P.StdErr.NumBytesAvailable;
if (StderrBytesRead + available > stderrlength) then
begin
stderrlength:=StderrBytesRead + READ_BYTES;
Setlength(stderrstring,stderrlength);
end;
StderrNumBytes := p.StdErr.Read(stderrstring[1+StderrBytesRead], available);
if StderrNumBytes > 0 then
Inc(StderrBytesRead, StderrNumBytes);
end
else
Sleep(100);
end;
end;
// Get left output after end of execution
finally
available:=P.Output.NumBytesAvailable;
Result := True;
while available > 0 do
begin
if (BytesRead + available > outputlength) then
begin
outputlength:=BytesRead + READ_BYTES;
Setlength(outputstring,outputlength);
end;
end;
NumBytes := p.Output.Read(outputstring[1+bytesread], available);
until false;
if NumBytes > 0 then
Inc(BytesRead, NumBytes);
available:=P.Output.NumBytesAvailable;
end;
end;
setlength(outputstring,B
ytes
R
ead
)
;
while assigned(P.
stderr
) and (P.S
tderr
.NumBytesAvailable > 0) do
Function InternalRunCommand(var P: TProcess; var Stdout, Stderr: string; var ExitStatus:integer): integer;
var
b
ytes
r
ead
_stdout : integer
;
outputlen_stdout : integer;
bytesread_
stderr
: integer;
outputlen_s
tderr
: integer;
begin
begin
available:=P.Stderr.NumBytesAvailable;
Result := -1; if(P=nil)then exit;
if (StderrBytesRead + available > stderrlength) then
try
try
P.Options := [poUsePipes];
bytesread_stdout := 0;
outputlen_stdout := 0;
bytesread_stderr := 0;
outputlen_stderr := 0;
P.Execute;
while(P.Running)do
begin
begin
stderrlength:=StderrBytesRead + READ_BYTES;
if(not ReadInputPipe(P.Output, bytesread_stdout, outputlen_stdout, Stdout))and
Setlength(stderrstring,stderrlength);
(not ReadInputPipe(P.Stderr, bytesread_stderr, outputlen_stderr, Stderr))
end;
then sleep(100);
StderrNumBytes := p.StdErr.Read(stderrstring[1+StderrBytesRead], available);
if StderrNumBytes > 0 then
Inc(StderrBytesRead, StderrNumBytes);
end;
end;
setlength(stderrstring,StderrBytesRead);
//Get remaining output after end of execution:
e
xit
s
tatus
:=p.e
xit
s
tatus;
ReadInputPipe(P.Output, bytesread_stdout, outputlen_stdout, Stdout);
r
esult
:=
0; // we came to here, document that.
ReadInputPipe(P.Stderr, bytesread_stderr, outputlen_stderr, Stderr);
E
xit
S
tatus
:= P.E
xit
S
tatus;
R
esult
:=
0; // we came to here, document that.
except
except
on e : Exception do
R
esult
:= 1;
begin
r
esult
:=1;
setlength(outputstring,BytesRead);
end;
end;
end;
finally
finally
p.free;
FreeAndNil(P);
SetLength(Stdout,bytesread_stdout);
SetLength(Stderr,bytesread_stderr);
end;
end;
end;
end;
f
unction RunCommand(const
exen
ame:string;const
c
ommands:array of string;var
outputstring
:string):
b
oolean;
F
unction RunCommand(const
ExeN
ame:string;const
C
ommands:array of string;var
Stdout,StdErr
:string):
B
oolean;
V
ar
v
ar
p : TProcess;
E
xit
S
tatus
,i
: integer;
i,
P
:
TProcess
;
e
xit
s
tatus
: integer;
ErrorString
:
String
;
begin
begin
p:=
TProcess.
c
reate(nil);
P :=
TProcess.
C
reate(nil);
p
.Executable
:=exen
ame;
P
.Executable
:= ExeN
ame;
if high(commands)>=0
then
if high(commands)>=0
for i:=low(
c
ommands) to high(
c
ommands)
do
then
for i:=low(
C
ommands) to high(
C
ommands)
p
.Parameters.
a
dd(
c
ommands[i]);
do P
.Parameters.
A
dd(
C
ommands[i]);
r
esult
:=i
nternal
runc
ommand(
p,outputstring,errorstring,e
xit
s
tatus)=0
;
R
esult
:= (I
nternal
RunC
ommand(
P,StdOut,StdErr,E
xit
S
tatus)=0
) and (E
xit
S
tatus
=0)
;
if e
xit
s
tatus
<>0 then result:=false
;
end;
end;
복사
복사됨
복사
복사됨
저장된 비교 결과
원본
파일 열기
function internalRuncommand(p:TProcess;var outputstring:string; var stderrstring:string; var exitstatus:integer):integer; var numbytes,bytesread,available : integer; outputlength, stderrlength : integer; stderrnumbytes,stderrbytesread : integer; begin result:=-1; try try p.Options := [poUsePipes]; bytesread:=0; outputlength:=0; stderrbytesread:=0; stderrlength:=0; p.Execute; while p.Running do begin // Only call ReadFromStream if Data from corresponding stream // is already available, otherwise, on linux, the read call // is blocking, and thus it is not possible to be sure to handle // big data amounts bboth on output and stderr pipes. PM. available:=P.Output.NumBytesAvailable; if available > 0 then begin if (BytesRead + available > outputlength) then begin outputlength:=BytesRead + READ_BYTES; Setlength(outputstring,outputlength); end; NumBytes := p.Output.Read(outputstring[1+bytesread], available); if NumBytes > 0 then Inc(BytesRead, NumBytes); end // The check for assigned(P.stderr) is mainly here so that // if we use poStderrToOutput in p.Options, we do not access invalid memory. else if assigned(P.stderr) and (P.StdErr.NumBytesAvailable > 0) then begin available:=P.StdErr.NumBytesAvailable; if (StderrBytesRead + available > stderrlength) then begin stderrlength:=StderrBytesRead + READ_BYTES; Setlength(stderrstring,stderrlength); end; StderrNumBytes := p.StdErr.Read(stderrstring[1+StderrBytesRead], available); if StderrNumBytes > 0 then Inc(StderrBytesRead, StderrNumBytes); end else Sleep(100); end; // Get left output after end of execution available:=P.Output.NumBytesAvailable; while available > 0 do begin if (BytesRead + available > outputlength) then begin outputlength:=BytesRead + READ_BYTES; Setlength(outputstring,outputlength); end; NumBytes := p.Output.Read(outputstring[1+bytesread], available); if NumBytes > 0 then Inc(BytesRead, NumBytes); available:=P.Output.NumBytesAvailable; end; setlength(outputstring,BytesRead); while assigned(P.stderr) and (P.Stderr.NumBytesAvailable > 0) do begin available:=P.Stderr.NumBytesAvailable; if (StderrBytesRead + available > stderrlength) then begin stderrlength:=StderrBytesRead + READ_BYTES; Setlength(stderrstring,stderrlength); end; StderrNumBytes := p.StdErr.Read(stderrstring[1+StderrBytesRead], available); if StderrNumBytes > 0 then Inc(StderrBytesRead, StderrNumBytes); end; setlength(stderrstring,StderrBytesRead); exitstatus:=p.exitstatus; result:=0; // we came to here, document that. except on e : Exception do begin result:=1; setlength(outputstring,BytesRead); end; end; finally p.free; end; end; function RunCommand(const exename:string;const commands:array of string;var outputstring:string):boolean; Var p : TProcess; i, exitstatus : integer; ErrorString : String; begin p:=TProcess.create(nil); p.Executable:=exename; if high(commands)>=0 then for i:=low(commands) to high(commands) do p.Parameters.add(commands[i]); result:=internalruncommand(p,outputstring,errorstring,exitstatus)=0; if exitstatus<>0 then result:=false; end;
수정본
파일 열기
Function ReadInputPipe(const Pipe: TInputPipeStream; var BytesRead,OutputLen: integer; var OutputString: string): Boolean; var available : integer; NumBytes : integer; begin Result := False; available := 0; if(BytesRead<0)then BytesRead := 0; if(OutputLen<0)then OutputLen := 0; repeat if(Pipe=nil)then exit; if(Pipe.NumBytesAvailable>0) then available := Pipe.NumBytesAvailable else break; if(BytesRead+available>OutputLen)then begin OutputLen := BytesRead+READ_BYTES; SetLength(OutputString,OutputLen); end; try try NumBytes := Pipe.Read(OutputString[1+BytesRead], available); if(NumBytes>0) then Inc(BytesRead, NumBytes); except Result := False; end; finally Result := True; end; until false; end; Function InternalRunCommand(var P: TProcess; var Stdout, Stderr: string; var ExitStatus:integer): integer; var bytesread_stdout : integer; outputlen_stdout : integer; bytesread_stderr : integer; outputlen_stderr : integer; begin Result := -1; if(P=nil)then exit; try try P.Options := [poUsePipes]; bytesread_stdout := 0; outputlen_stdout := 0; bytesread_stderr := 0; outputlen_stderr := 0; P.Execute; while(P.Running)do begin if(not ReadInputPipe(P.Output, bytesread_stdout, outputlen_stdout, Stdout))and (not ReadInputPipe(P.Stderr, bytesread_stderr, outputlen_stderr, Stderr)) then sleep(100); end; //Get remaining output after end of execution: ReadInputPipe(P.Output, bytesread_stdout, outputlen_stdout, Stdout); ReadInputPipe(P.Stderr, bytesread_stderr, outputlen_stderr, Stderr); ExitStatus := P.ExitStatus; Result := 0; // we came to here, document that. except Result := 1; end; finally FreeAndNil(P); SetLength(Stdout,bytesread_stdout); SetLength(Stderr,bytesread_stderr); end; end; Function RunCommand(const ExeName:string;const Commands:array of string;var Stdout,StdErr:string): Boolean; var ExitStatus,i : integer; P : TProcess; begin P := TProcess.Create(nil); P.Executable := ExeName; if high(commands)>=0 then for i:=low(Commands) to high(Commands) do P.Parameters.Add(Commands[i]); Result := (InternalRunCommand(P,StdOut,StdErr,ExitStatus)=0) and (ExitStatus=0); end;
비교하기