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

TFileStream的有关问题

2013-10-27 
TFileStream的问题我写了一个测试函数,用来拷贝某个文件到另外一个地方,主要使用来验证write和read的用法

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;


看看这个例子

热点排行