type
TByteArray = array of byte;
function FileReadAllBytes(fileName: string): TByteArray;
const
readBufSize = 1023;
var
res: TByteArray;
myFile: File of byte;
readBuf: array [0..readBufSize] of byte;
i, j: integer;
readInFact: integer;
begin
AssignFile(myFile, fileName);
Reset(myFile);
SetLength(res, FileSize(myFile));
i := 0;
repeat
blockread(myFile, readBuf, readBufSize+1, readInFact);
for j := 0 to readInFact - 1 do
begin
res[i] := readBuf[j];
i := i + 1;
end;
until i >= FileSize(myFile);
CloseFile(myFile);
Result := res;
end;
我们像这样使用这个函数(这里我将数据从客户端传输到服务器):
var
test3: TByteArray;
....
test3 := FileReadAllBytes('bigfile.txt');
IdTCPClient1.WriteBuffer(Pointer(test3)^, Length(test3));
转移不是大问题。我更喜欢硬核,即使用“原始”字节数组。也就是说,我们将文件读入一个动态的字节数组,不幸的是在 Delphi 7 中没有函数可以快速做到这一点,但是你可以自己写,我是这样写的:
我们像这样使用这个函数(这里我将数据从客户端传输到服务器):
好吧,那么在服务器上你可以用同样的方式读取 ReadBuffer 并写入文件(我用 C# 做了一个服务器,它已经有 WriteAllBytes 函数),只有这种情况下的服务器应该知道文件大小(以字节为单位),如果它不适合你,那么你需要在文件字节之前将它添加到它的大小数组中,以便服务器首先计算大小并知道为文件分配多少字节,同时重要的是立即形成一个字节数组并调用 WriteBuffer 一次,否则它可能会混淆,文件将首先出现,然后是大小。
总的来说,即使是在这么老的 Delphi 中,出于习惯,所有这些都是相当乏味和漫长的,而不是困难的。
但是要在 Internet 出现任何问题时提供 24/7 的稳定持续连接而不会出现故障,也就是说,质量达到 Skype 和 ICQ 的水平,这真的很困难,我还没有决定。