2

ファイルの内容 (この場合は Excel ファイル) をコンソール出力にストリーミングする方法について、かなり長い間調べてきました。Windows 用にコンパイルする場合、THandleStreamSTDOUT (コンソール出力) へのハンドルと組み合わせて使用​​するのは公園での散歩です。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;
4

1 に答える 1