目的是想实现把一文件复制到U盘里去,目标U盘是通过ComboBox选择;但编译是...message "I/O error 21".... 请问该如何改正 ?代码如下...
procedure TForm1.Mycopyfile(a,b: string);
var
  from,aa: file of byte;
  buffer: array[0..4069]of char;
  numread: integer;
  filelength: longint;
begin
  try
    AssignFile(from,a);
    Reset(from);
    AssignFile(aa,b);
    ReWrite(aa);
    FileLength := filesize(from);    //文件大小
  except
    Showmessage('文件复制错误!');
    exit;
  end;
  with progressbar1 do
  begin
    min := 0;
    position:=min;
    max := filelength;
    while filelength >0 do
    begin
      BlockRead(from,buffer[0],sizeof(buffer),numread);
      filelength := filelength - numread;
      BlockWrite(aa,buffer[0],numread);
      position:= position + numread;
      application.ProcessMessages;
    end;
    CloseFile(from);
    CloseFile(aa);
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
var
  i,DType:integer;
  Disk:string;
begin
  ProgressBar1.Hide;
  for i:=65 to 90 do
    begin
      Disk:=chr(i)+':\';
      DType := GetDriveType(PChar(Disk));
      if DType = 5 then
        ComboBox1.Items.Add(Format('%s %s',[Disk, '可移动磁盘']));
    end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  ProgressBar1.Show;
  mycopyfile('C:\bmp.bmp',Copy(ComboBox1.Text,1,3)+'bmp.bmp');
//mycopyfile('C:\bmp.bmp','J:\bmp.bmp')); 这样可以
  Application.MessageBox('复制完毕!        ','提示',MB_ICONASTERISK);
  ProgressBar1.Hide ;
  Edit3.Text:=Copy(ComboBox1.Text,1,3)+'bmp.bmp';
end;

解决方案 »

  1.   

    把 if DType = 5 then 这句,改为 if DType = DRIVE_REMOVABLE then......关于GetDriveType函数的返回值,请查看Delphi的WindowsSDK帮助
      

  2.   

    也就是说,改为 if DType = 2 then
      

  3.   

    谢谢,lihuasoft问多个问题,如果实现同时复制多个文件,改如何?我不想多次调用mycopyfile ,多次调用mycopyfile的话,会多次出现进度条我想复制多个文件时,只用一个进度条显示进度
      

  4.   

    你可以改一下Mycopyfile(a,b: string)函数,参数为数组(或记录),要拷贝的每一个文件为一个数组元素。然后,在  with progressbar1 do 这里面做一个循环,完成每一个元素(每一个文件)的拷贝。具体实现,你自己写代码吧。
      

  5.   

    如:type
      FileNames : array of string;procedure MyCopyFile(a,b : FileNames);
    var
      I : integer;
    begin
      //....
      //....
      with progressbar1 do 
        begin
        for I := Low(a) to High(a) do
          //.....
        end;
    end;
      

  6.   

    刚拼凑出来了...不过还是谢谢lihuasoft,接分