读书人

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

发布时间: 2012-04-24 14:15:38 作者: rapoo

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读写缓冲。

读书人网 >.NET

热点推荐