unit Unit1;  
  
interface  
  
uses  
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  Dialogs, StdCtrls;  
  
type  
  TForm1 = class(TForm)  
    Memo1: TMemo;  
    Button1: TButton;  
    Button2: TButton;  
    Button3: TButton;  
    Button4: TButton;  
    Button5: TButton;  
    Button6: TButton;  
    Button7: TButton;  
    procedure Button1Click(Sender: TObject);  
    procedure Button2Click(Sender: TObject);  
    procedure Button3Click(Sender: TObject);  
    procedure Button4Click(Sender: TObject);  
    procedure Button5Click(Sender: TObject);  
    procedure Button6Click(Sender: TObject);  
    procedure Button7Click(Sender: TObject);  
  private  
    { Private declarations }  
  public  
    { Public declarations }  
  end;  
  
var  
  Form1: TForm1;  
  
implementation  
  
{$R *.dfm}  
  
const  
  FileName = 'c:\temp\binary.dat';  
var  
  F: file;  
  
//用无类型的方式写入一个字节  
procedure TForm1.Button1Click(Sender: TObject);  
var  
  b: Byte;  
begin  
  AssignFile(F,FileName);  
  Rewrite(F,1); //第二个参数表示: 把 1 个字节当作一个写入单位  
  
  b := 65;  
  BlockWrite(F,b,1); //写入; 参数2是要写入的内容; 参数3表示写入 1 次.  
  
  CloseFile(F);  
//落实 binary.dat 的大小: 1个字节; 内容: A (可用记事本打开)  
end;  
  
  
//用无类型的方式读出一个字节  
procedure TForm1.Button2Click(Sender: TObject);  
var  
  b: Byte;  
begin  
  AssignFile(F,FileName);  
  Reset(F,1); //把 1 个字节当作一个读取单位  
  
  BlockRead(F,b,1); //读取一次; 放入 b  
  ShowMessage(Chr(b)); //A  
  
  CloseFile(F);  
end;  
  
  
//写入更多字节  
procedure TForm1.Button3Click(Sender: TObject);  
var  
  buffer: array[0..127] of Byte;  
  i: Integer; //储存多个字节, 需要用数组了  
begin  
  for i := Low(buffer) to High(buffer) do  
    buffer[i] := i; //给数组赋值, 注意现在数组大小是 128  
  
  AssignFile(F,FileName);  
  Rewrite(F,32); //规定把 32 个字节当作一个读取单位, 注意这个数字和缓冲区大小必须是倍数关系  
  
  BlockWrite(F,buffer,4); //需要写入几次呢? 128/32=4  
  
  CloseFile(F);  
//写成的文件肯定是128字节大小, 但用记事本可能看不了, 因为这个二进制不是文本  
end;  
  
  
//读出  
procedure TForm1.Button4Click(Sender: TObject);  
var  
  buffer: array[0..127] of Byte;  
  i: Integer;  
begin  
  AssignFile(F,FileName);  
  Reset(F,4); //把 4 字节当作一个读取单位; 为了那个倍数关系, 这里一般是 1  
  
  BlockRead(F,buffer,32); //当然需要 32 次才能读完  
  
  CloseFile(F);  
  
  //怎么显示一下呢? 还是用 Memo 吧; 显示字符? 数字? 还是十六进制吧  
  Memo1.Clear;  
  for i := Low(buffer) to High(buffer) do  
  begin  
    Memo1.Lines.Add(IntToHex(buffer[i],1));  
  end;  
(*显示结果: 0 1 2 3 ... 7D 7E 7F *)  
  
end;  
  
  
//读写 Char 与实际读写字节  
procedure TForm1.Button5Click(Sender: TObject);  
var  
  cArr1,cArr2: array[0..4] of Char;  
  i: Integer;  
  num: Integer; //记录实际读写的字节数  
begin  
  for i := Low(cArr1) to High(cArr1) do  
    cArr1[i] := Chr(65+i); //填充 A B C D E  
  
  AssignFile(F,FileName);  
  Rewrite(F,1); //建立  
  
  BlockWrite(F,cArr1,Length(cArr1),num); //参数4: num 是实际写入的字节数  
  ShowMessage(IntToStr(num)); //5  
  
  Reset(F,1); //重新打开  
  
  BlockRead(F,cArr2,Length(cArr2),num); //参数5: num 是实际读出的字节数  
  ShowMessage(IntToStr(num)); //5  
  
  ShowMessage(cArr2); //ABCDE  
  
  CloseFile(F);  
end;  
  
  
//写入长字符串, 读出其十六进制码  
procedure TForm1.Button6Click(Sender: TObject);  
var  
  p: PChar;  
  b: Byte;  
begin  
  p := '万一的 Delphi 博客';  
  
  AssignFile(F,FileName);     //关联文件名  
  Rewrite(F,1);               //创建并打开  
  BlockWrite(F,p,Length(p));  //写入  
  
  
  FileMode := fmOpenRead;     //这时可以设文件为只读  
  Reset(F,1);                 //为读取打开  
  
  Memo1.Clear;  
  while not Eof(F) do  
  begin  
    BlockRead(F,b,1);  
    Memo1.Text := Memo1.Text + IntToHex(b,2) + ' ';  
  end;  
  //显示结果: 70 F0 45 00 08 F7 12 00 A6 FB 43 00 A0 1A E5 00 FF C5  
  
  CloseFile(F);  
end;  
  
  
//复制个文件  
procedure TForm1.Button7Click(Sender: TObject);  
var  
  FromF,ToF: file;  
  NumRead,NumWritten: Integer;  
  Buffer: array[1..2048] of Byte;  
begin  
  AssignFile(FromF, 'c:\temp\test1.dat'); //假定有这个文件  
  Reset(FromF, 1);  
  AssignFile(ToF, 'c:\temp\test2.dat');  
  Rewrite(ToF, 1);  
  
  repeat  
    BlockRead(FromF, Buffer, SizeOf(Buffer), NumRead);  
    BlockWrite(ToF, Buffer, NumRead, NumWritten);  
  until (NumRead = 0) or (NumWritten <> NumRead);  
  { NumRead=0 表示读完了; NumWritten <> NumRead 表示磁盘空间不够了 }  
  
  CloseFile(FromF);  
  CloseFile(ToF);  
end;  
  
end.  

 

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, StdCtrls;  
  8.   
  9. type  
  10.   TForm1 = class(TForm)  
  11.     Memo1: TMemo;  
  12.     Button1: TButton;  
  13.     Button2: TButton;  
  14.     Button3: TButton;  
  15.     Button4: TButton;  
  16.     Button5: TButton;  
  17.     Button6: TButton;  
  18.     Button7: TButton;  
  19.     procedure Button1Click(Sender: TObject);  
  20.     procedure Button2Click(Sender: TObject);  
  21.     procedure Button3Click(Sender: TObject);  
  22.     procedure Button4Click(Sender: TObject);  
  23.     procedure Button5Click(Sender: TObject);  
  24.     procedure Button6Click(Sender: TObject);  
  25.     procedure Button7Click(Sender: TObject);  
  26.   private  
  27.     { Private declarations }  
  28.   public  
  29.     { Public declarations }  
  30.   end;  
  31.   
  32. var  
  33.   Form1: TForm1;  
  34.   
  35. implementation  
  36.   
  37. {$R *.dfm}  
  38.   
  39. const  
  40.   FileName = 'c:\temp\binary.dat';  
  41. var  
  42.   F: file;  
  43.   
  44. //用无类型的方式写入一个字节  
  45. procedure TForm1.Button1Click(Sender: TObject);  
  46. var  
  47.   b: Byte;  
  48. begin  
  49.   AssignFile(F,FileName);  
  50.   Rewrite(F,1); //第二个参数表示: 把 1 个字节当作一个写入单位  
  51.   
  52.   b := 65;  
  53.   BlockWrite(F,b,1); //写入; 参数2是要写入的内容; 参数3表示写入 1 次.  
  54.   
  55.   CloseFile(F);  
  56. //落实 binary.dat 的大小: 1个字节; 内容: A (可用记事本打开)  
  57. end;  
  58.   
  59.   
  60. //用无类型的方式读出一个字节  
  61. procedure TForm1.Button2Click(Sender: TObject);  
  62. var  
  63.   b: Byte;  
  64. begin  
  65.   AssignFile(F,FileName);  
  66.   Reset(F,1); //把 1 个字节当作一个读取单位  
  67.   
  68.   BlockRead(F,b,1); //读取一次; 放入 b  
  69.   ShowMessage(Chr(b)); //A  
  70.   
  71.   CloseFile(F);  
  72. end;  
  73.   
  74.   
  75. //写入更多字节  
  76. procedure TForm1.Button3Click(Sender: TObject);  
  77. var  
  78.   buffer: array[0..127] of Byte;  
  79.   i: Integer; //储存多个字节, 需要用数组了  
  80. begin  
  81.   for i := Low(buffer) to High(buffer) do  
  82.     buffer[i] := i; //给数组赋值, 注意现在数组大小是 128  
  83.   
  84.   AssignFile(F,FileName);  
  85.   Rewrite(F,32); //规定把 32 个字节当作一个读取单位, 注意这个数字和缓冲区大小必须是倍数关系  
  86.   
  87.   BlockWrite(F,buffer,4); //需要写入几次呢? 128/32=4  
  88.   
  89.   CloseFile(F);  
  90. //写成的文件肯定是128字节大小, 但用记事本可能看不了, 因为这个二进制不是文本  
  91. end;  
  92.   
  93.   
  94. //读出  
  95. procedure TForm1.Button4Click(Sender: TObject);  
  96. var  
  97.   buffer: array[0..127] of Byte;  
  98.   i: Integer;  
  99. begin  
  100.   AssignFile(F,FileName);  
  101.   Reset(F,4); //把 4 字节当作一个读取单位; 为了那个倍数关系, 这里一般是 1  
  102.   
  103.   BlockRead(F,buffer,32); //当然需要 32 次才能读完  
  104.   
  105.   CloseFile(F);  
  106.   
  107.   //怎么显示一下呢? 还是用 Memo 吧; 显示字符? 数字? 还是十六进制吧  
  108.   Memo1.Clear;  
  109.   for i := Low(buffer) to High(buffer) do  
  110.   begin  
  111.     Memo1.Lines.Add(IntToHex(buffer[i],1));  
  112.   end;  
  113. (*显示结果: 0 1 2 3 ... 7D 7E 7F *)  
  114.   
  115. end;  
  116.   
  117.   
  118. //读写 Char 与实际读写字节  
  119. procedure TForm1.Button5Click(Sender: TObject);  
  120. var  
  121.   cArr1,cArr2: array[0..4] of Char;  
  122.   i: Integer;  
  123.   num: Integer; //记录实际读写的字节数  
  124. begin  
  125.   for i := Low(cArr1) to High(cArr1) do  
  126.     cArr1[i] := Chr(65+i); //填充 A B C D E  
  127.   
  128.   AssignFile(F,FileName);  
  129.   Rewrite(F,1); //建立  
  130.   
  131.   BlockWrite(F,cArr1,Length(cArr1),num); //参数4: num 是实际写入的字节数  
  132.   ShowMessage(IntToStr(num)); //5  
  133.   
  134.   Reset(F,1); //重新打开  
  135.   
  136.   BlockRead(F,cArr2,Length(cArr2),num); //参数5: num 是实际读出的字节数  
  137.   ShowMessage(IntToStr(num)); //5  
  138.   
  139.   ShowMessage(cArr2); //ABCDE  
  140.   
  141.   CloseFile(F);  
  142. end;  
  143.   
  144.   
  145. //写入长字符串, 读出其十六进制码  
  146. procedure TForm1.Button6Click(Sender: TObject);  
  147. var  
  148.   p: PChar;  
  149.   b: Byte;  
  150. begin  
  151.   p := '万一的 Delphi 博客';  
  152.   
  153.   AssignFile(F,FileName);     //关联文件名  
  154.   Rewrite(F,1);               //创建并打开  
  155.   BlockWrite(F,p,Length(p));  //写入  
  156.   
  157.   
  158.   FileMode := fmOpenRead;     //这时可以设文件为只读  
  159.   Reset(F,1);                 //为读取打开  
  160.   
  161.   Memo1.Clear;  
  162.   while not Eof(F) do  
  163.   begin  
  164.     BlockRead(F,b,1);  
  165.     Memo1.Text := Memo1.Text + IntToHex(b,2) + ' ';  
  166.   end;  
  167.   //显示结果: 70 F0 45 00 08 F7 12 00 A6 FB 43 00 A0 1A E5 00 FF C5  
  168.   
  169.   CloseFile(F);  
  170. end;  
  171.   
  172.   
  173. //复制个文件  
  174. procedure TForm1.Button7Click(Sender: TObject);  
  175. var  
  176.   FromF,ToF: file;  
  177.   NumRead,NumWritten: Integer;  
  178.   Buffer: array[1..2048] of Byte;  
  179. begin  
  180.   AssignFile(FromF, 'c:\temp\test1.dat'); //假定有这个文件  
  181.   Reset(FromF, 1);  
  182.   AssignFile(ToF, 'c:\temp\test2.dat');  
  183.   Rewrite(ToF, 1);  
  184.   
  185.   repeat  
  186.     BlockRead(FromF, Buffer, SizeOf(Buffer), NumRead);  
  187.     BlockWrite(ToF, Buffer, NumRead, NumWritten);  
  188.   until (NumRead = 0) or (NumWritten <> NumRead);  
  189.   { NumRead=0 表示读完了; NumWritten <> NumRead 表示磁盘空间不够了 }  
  190.   
  191.   CloseFile(FromF);  
  192.   CloseFile(ToF);  
  193. end;  
  194.   
  195. end.