首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

delphi 文件流复制有关问题,诡异!求解

2012-04-24 
delphi 文件流复制问题,诡异!求解![codeDelphi(Pascal)][/code]//前面代码为遍历文件夹下所有文件ts1+DC

delphi 文件流复制问题,诡异!求解!
[code=Delphi(Pascal)][/code]
//前面代码为遍历文件夹下所有文件'ts1+DCIM\100DSCIM\ ts1 为移动盘符
for sf1 := 2 to sf -1 do
begin
try
memo1.Lines.Add('尝试复制:'+ts1 +'DCIM\100DSCIM\' + sfile[sf1]);
getpath := ts1 +'DCIM\100DSCIM\' + sfile[sf1];
setpath := ss + '\' + sfile[sf1];
  getStream := TFileStream.Create(getPath, fmOpenRead or fmShareExclusive);
  setStream := TFileStream.Create(setPath, fmCreate);
  memo1.Lines.Add('尝试:'+ts1 +'DCIM\100DSCIM\' + sfile[sf1]+'读入缓存');
  nnum := getStream.Size;
  setStream.Size := nnum;
  getStream.Position := 0;
  setStream.Position := 0;

  BufSize := nnum;
  block := BufSize div 100;
  GetMem(buf, BufSize);
  //ProgressBar1.Max := 100;
  //ProgressBar1.Min := 0;
  //ProgressBar1.Position := 0;

  while nnum <> 0 do
  begin
  Application.ProcessMessages;
  n := block;
  if n > nnum then n := nnum;
  getStream.ReadBuffer(buf^, n);
  setStream.WriteBuffer(buf^, n);
  if num = 1 then
  ProgressBar1.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 2 then
  ProgressBar2.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 3 then
  ProgressBar3.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 4 then
  ProgressBar4.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 5 then
  ProgressBar5.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 6 then
  ProgressBar6.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 7 then
  ProgressBar7.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 8 then
  ProgressBar8.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 9 then
  ProgressBar9.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 10 then
  ProgressBar10.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 11 then
  ProgressBar11.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 12 then
  ProgressBar12.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 13 then
  ProgressBar13.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 14 then
  ProgressBar14.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 15 then
  ProgressBar15.Position := Trunc((1 - nnum / BufSize) * 100);
  if num = 16 then
  ProgressBar16.Position := Trunc((1 - nnum / BufSize) * 100);
  Dec(nnum, n);
  end;
  result := 0;
  FreeMem(buf, BufSize);
  getStream.Free;
  setStream.Free;
  ProgressBar1.Position := 0;
  ProgressBar2.Position := 0;
  ProgressBar3.Position := 0;
  ProgressBar4.Position := 0;
  ProgressBar5.Position := 0;
  ProgressBar6.Position := 0;
  ProgressBar7.Position := 0;
  ProgressBar8.Position := 0;
  ProgressBar9.Position := 0;
  ProgressBar10.Position := 0;
  ProgressBar11.Position := 0;
  ProgressBar12.Position := 0;
  ProgressBar13.Position := 0;
  ProgressBar14.Position := 0;
  ProgressBar15.Position := 0;
  ProgressBar16.Position := 0;
  except
  memo1.Lines.Add('开始删除'+ss);
  //listbox1.Items.Add(datetimeTostr(NOW)+'第'+intTostr(num)+'端口:'+'->'+k2+'->'+k1+sfile[sf1]+'文件损坏,请检修!!!');
  FillChar(T1, SizeOf(T1), 0);
  //listbox1.Items.Add(datetimeTostr(NOW)+'第'+intTostr(num)+'端口:'+'->'+k2+'->'+k1+sfile[sf1]+'文件损坏,请检修!!!');
//showmessage(sfile[sf1]+'文件损坏');


 With T1 do
 begin
 Wnd := 0;
 wFunc := FO_DELETE;
 Pfrom := pchar(ss+#0);
 //ss8 := ts1;
 //timer6.Enabled := true;
 Pto := Pchar(ss+#0);
 fFlags := FOF_ALLOWUNDO + FOF_NOCONFIRMATION + FOF_NOERRORUI;
 end;
 //memo1.Lines.Add('开始执行删除!!');
  SHFileOperation(T1);
stringgrid2.Cells[1,num] := k2;
stringgrid2.Cells[2,num] := k1;
stringgrid2.Cells[3,num] := '设备文件有损坏!!!';
getStream.Free;
  setStream.Free;
  ProgressBar1.Position := 0;
  ProgressBar2.Position := 0;
  ProgressBar3.Position := 0;
  ProgressBar4.Position := 0;
  ProgressBar5.Position := 0;
  ProgressBar6.Position := 0;
  ProgressBar7.Position := 0;
  ProgressBar8.Position := 0;
  ProgressBar9.Position := 0;
  ProgressBar10.Position := 0;
  ProgressBar11.Position := 0;
  ProgressBar12.Position := 0;
  ProgressBar13.Position := 0;
  ProgressBar14.Position := 0;
  ProgressBar15.Position := 0;
  ProgressBar16.Position := 0;
  result := 1;
  end;
现在的问题是:当我复制的视频文件大小<=700M时 是可以正常运行滴,但当设备单一视频文件大小>=800M时,
复制的视频文件大小跟原来视频文件一样,但却无法播放
实在是无法理解,求高手解救!

[解决办法]
block := BufSize div 100;
GetMem(buf, BufSize);

可能是申请内存太大了,你试着用 600M做基准:取600M/100的大小,
另外申请内存放在循环之前(反复申请,可能对系统造成的负担越来越大)。
[解决办法]
在循环之前先开辟读写缓冲区,不要在循环里重复申请释放。文件复制也不是你这样的,一次申请几百兆的缓冲区?现在内存都大,也不能这样,一般固定32m就可以,缓冲区满后写入硬盘,太大也没意义,i/o速度是瓶颈,我一般都是使用8m读写缓冲。

热点排行