Diff
checker
文本
文本
圖像
文檔
Excel
文件夾
Legal
Enterprise
桌面版
定價
登入
下載 Diffchecker 桌面版
比較文本
尋找兩個文字檔案之間的差異
工具
歷史
顯示
檢視
拆分
統一
即時編輯器
隱藏空白變更
摺疊未變更行
關閉換行
比對精度
智能
語法
無
變更外觀
處理
忽略
文字轉換
前往第一個差異
編輯輸入
Diffchecker Desktop
執行Diffchecker最安全的方式。取得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;
尋找差異