ファイルの内容 (この場合は Excel ファイル) をコンソール出力にストリーミングする方法について、かなり長い間調べてきました。Windows 用にコンパイルする場合、THandleStream
STDOUT (コンソール出力) へのハンドルと組み合わせて使用するのは公園での散歩です。Win32 API を使用するため、Linux (ちなみに Debian) 用にコンパイルする場合は明らかに機能しません。
私はこれに相当するものを探しています:
...
aFileStream := TFileStream.Create(FullFileName,fmOpenRead); // This creates the input stream
aOutputStream := THandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE)); // Here goes the output stream
aOutputStream.CopyFrom(aFileStream, aFileStream.Size); // And the copy operation
...
更新: 以下は Windows で動作するようですが、Linux に切り替えるとすぐにコンパイルされないため、PAnsiChar
不明です。
...
f : File;
Buff : PAnsiChar;
BytesRead : integer;
ByteSize : integer;
iBuffRunner : integer;
...
AssignFile(F, 'details.xlsx');
Reset(F,1);
ByteSize := (fileSize(F));
GetMem(Buff,ByteSize);
BlockRead(F,Buff[0],ByteSize,BytesRead);
CloseFile(F);
for iBuffRunner := 0 to (Bytesize-1) do
System.Write(Buff[iBuffRunner]);
FreeMem(Buff);
役立つかもしれない何かを理解できますか?
更新:
こんにちはレミー、
ご協力いただきありがとうございます。私はほとんどそこにいますが、まだ最後のビットに苦労しています。system.output に対して BlockWrite を実行できるはずだとおっしゃいました。ただし、BlockWrite は最初のパラメーターとして var F: File を想定していますが、System.Output は TEXT 型ですか?
さらに、読んでいるファイルの「File」ではなく「File of Byte」を使用していますが、コンソールへの出力用に適切に変換する方法がわかりません。
これは、この Linux POC の現在の状態です。
この部分は正常に動作します: details.xlsx を読み取り、内容を test.xlsx (基本的にはコピー) に書き込みます。宛先ファイルはソース ファイルと同じです。
この部分はまだ機能していませんが、最終的には必要なものです: details.xlsx の内容を stdout に書き込みます:
const
MaxBufSize = 4096;
var
f : File of Byte;
tf : File of Byte;
Buff : array of Byte;
BytesRead : integer;
ByteSize : integer;
WillRead : integer;
begin
AssignFile(F, 'details.xlsx');
Reset(F);
ByteSize := (fileSize(F));
if ByteSize > MaxBufSize then
BytesRead := MaxBufSize
else
BytesRead := ByteSize;
SetLength(Buff, BytesRead);
AssignFile(tf, 'test.xlsx');
Rewrite(tf);
try
while ByteSize <> 0 do
begin
if ByteSize > BytesRead then
WillRead := BytesRead
else
WillRead := ByteSize;
BlockRead(F,Buff[0], WillRead);
BlockWrite(tf,Buff[0], WillRead);
//BlockWrite(System.Output, buff[0], WillRead);
Dec(ByteSize, WillRead);
end;
finally
SetLength(Buff,0);
CloseFile(f);
CloseFile(tf);
end;
System.Readln;
end;
最終更新:
const
MaxBufSize = 4096;
var
f : File of Byte;
tf : File of Byte;
Buff : array of Byte;
BytesRead : integer;
ByteSize : integer;
WillRead : integer;
iBufRunner : integer;
begin
AssignFile(F, 'details.xlsx');
Reset(F);
ByteSize := (fileSize(F));
if ByteSize > MaxBufSize then
BytesRead := MaxBufSize
else
BytesRead := ByteSize;
SetLength(Buff, BytesRead);
AssignFile(tf, 'test.xlsx');
Rewrite(tf);
try
while ByteSize <> 0 do
begin
if ByteSize > BytesRead then
WillRead := BytesRead
else
WillRead := ByteSize;
BlockRead(F,Buff[0], WillRead);
BlockWrite(tf,Buff[0], WillRead);
for iBufRunner := 0 to (WillRead - 1) do
System.Write(System.Output, UTF8Char(Buff[iBufRunner]));
Dec(ByteSize, WillRead);
end;
finally
SetLength(Buff,0);
CloseFile(f);
CloseFile(tf);
end;
System.Readln;
end;