TFileStream的问题
我写了一个测试函数,用来拷贝某个文件到另外一个地方,主要使用来验证write和read的用法
函数运行完毕后,报了一个错误
Access violation at address 0000000 write of address 00000000
我估计是那个动态内存分配的问题,然后就用
Finalize(strData);FillChar进行了释放处理,结果Finalize报错了,难道write在写的时候内存被释放了,导致Finalize出错?
不知道什么原因,delphi不熟练,请帮忙解决,谢谢。
procedure TForm2.Button3Click(Sender: TObject);
var
oFS:TFileStream;
fullFileName:string;
distFileName:string;
iFileSize:Int64;
iRet:Int64;
iTotal:Int64;
buffer:array[0..10239] of char;
strData:string;
const
CMaxBufflen=10240;
begin
fullFileName:= self.txtFileName.Text;
if(fullFileName='') then
begin
showmessage('请选择文件');
exit;
end;
oFS := TFileStream.Create(fullFileName, fmOpenRead or fmShareExclusive);
oFS.Position:=0;
iFileSize := oFS.Size;
iRet := 0;
iTotal := 0;
progFile.Position:=0;
progFile.max:=iFileSize;
distFileName:=ExtractFileName(fullFileName);
distFileName:='D:\' +distFileName;
m_testTFS:= TFileStream.Create(distFileName, fmCreate);
while iTotal < iFileSize do
begin
if iFileSize-iTotal>=CMaxBufflen then
begin
iRet := oFS.Read(Buffer, CMaxBuffLen);
//SetLength(strData,CMaxBuffLen);
//strData:= StrPas(Buffer);
m_testTFS.Write(Buffer,CMaxBufflen);
end
else
begin
SetLength(strData,iFileSize-iTotal);
iRet := oFS.Read(strData, iFileSize-iTotal);
m_testTFS.Write(strData,iFileSize-iTotal);
//FreeAndNil(strData);
// Finalize(strData);
FillChar(strData,iFileSize-iTotal,0);
end;
sleep(1);
iTotal:=iTotal+iRet;
progFile.Position:=iTotal;
end;
FreeAndNil(oFS);
FreeAndNil(m_testTFS);
showmessage('写入完毕');
end;
[解决办法]
问题可能出在 strData 上,有了 buffer 完全没有必要用它了,白白多用了一大堆代码。
读文件到尾部时,自然会返回0,不需要用 iFileSize 来判断
while true do
begin
iRet := oFS.Read(buffer, CMaxBufflen);
if iRet<=0 then
Break;
m_testTFS.Write(buffer, iRet);
inc(iTotal, iRet);
end;
[解决办法]
估计就是字节长度问题,特别对最后一段,好好调试查查
[解决办法]
procedure TForm1.Button1Click(Sender: TObject);
var
getStream,setStream: TFileStream; {声明一个文件流}
getPath,setPath: string;
begin
getPath := 'c:\temp\get.jpg'; {这个文件存在}
setPath := 'c:\temp\set.jpg'; {这个会自动建立}
getStream := TFileStream.Create(getPath, fmOpenRead or fmShareExclusive);
setStream := TFileStream.Create(setPath, fmCreate);
getStream.Position := 0; {流指针移到开始, 复制时从这里开始}
setStream.CopyFrom(getStream, getStream.Size); {Copy 流}
{CopyFrom 的第二个参数是要复制的内容大小; 如果为 0 , 不管指针在什么位置都会复制所有内容}
getStream.Free;
setStream.Free;
end;
看看这个例子