文件流TFileStream和PBYTE(100)

  • 主题发起人 主题发起人 me555555
  • 开始时间 开始时间
M

me555555

Unregistered / Unconfirmed
GUEST, unregistred user!
var Dms:TMemoryStream; //dms:TFileStream; Topby: PBYTE;begin 当dms是内存流的时候 Topby := PBYTE(Dms.Memory); //得到内存流的地址指针 当dms是文件流的时候 Topby := PBYTE(Dms.Memory);//出现错误 //请问如何得到文件流的指针Topby
 
文件流没有指针,只有File Handle
 
任何流读有指针YouMem.Memory就是!
 
楼上的研究下VCL源码再来说吧,不要告诉别人错误的答案,FileStream是对文件的操作,其主要操作是调用几个文件方面的API,如CreateFile,ReadFile等等.
 
TMemoryStream;TFileStream;都市从TStream继承的啊!呵呵!
 
delphi 7.0 TFileStream 根本就没得 Memory 这个属性TMemoryStream 的 LoadFromFile 也是调用的 TFileStream所以直接就使用 TMemoryStream就可以了吧
 
我测试了一下,tfilestream确实没有memory属性,因为它是继承THandleStream(没有Memory属性),而TMemoryStream 是继承TCustomMemoryStream(这个有Memory属性)。但是我用下面的语句执行,却不能执行tbyte1 := PByte(dms1.memory)语句,怎么回事啊?这?如果我在写同样的一条语句,它又执行了!高手解疑一下!procedure TForm1.Button1Click(Sender: TObject);var dms1 : TMemoryStream; dms : TFileStream; tbyte1,tbyte : PByte; path : string; filename : string;begin path := 'C:/Documents and Settings/Administrator/桌面/' ; filename := path + 'fgf .txt'; try try dms := TFileStream.Create(filename,0); tbyte := PByte(dms.Size); dms1 := TMemoryStream.Create; dms1.LoadFromStream(dms); // filename := path +'11.txt'; // dms1.SaveToFile(filename); tbyte1 := PByte(dms1.memory);//怎么这句不执行啊? except on e: Exception do ShowMessage(e.Message); end; finally dms.Free; dms1.Free; end;end;
 
西西!tbyte1 := PByte(dms1.memory);//怎么这句不执行啊?你就没有应用tbyte1啊,只要下面这样就执行了:tbyte1 := PByte(dms1.memory);asm mov ax,word ptr tbyte1 end;
 
dms := TFileStream.Create(filename,0);tbyte := PByte(dms.Size);但是上面这句它怎么执行了呢?
 
我说的不执行,是什么意思呢?是这样的!我按F8是吧,一步一步的运行。procedure TForm1.Button1Click(Sender: TObject);var dms1 : TMemoryStream; dms : TFileStream; tbyte1,tbyte : PByte; path : string; filename : string;begin path := 'C:/Documents and Settings/Administrator/桌面/' ; filename := path + 'fgf .txt'; try try dms := TFileStream.Create(filename,0);//按F8会跳到下面那句 tbyte := PByte(dms.Size);//这句会执行 dms1 := TMemoryStream.Create; dms1.LoadFromStream(dms);//按F8的时直接跳到FINALLY去了 // filename := path +'11.txt'; // dms1.SaveToFile(filename tbyte1 := PByte(dms1.memory);//怎么这句不执行啊? except on e: Exception do ShowMessage(e.Message); end; finally dms.Free; dms1.Free; end;end;
 
// to :lqcros我刚开始学习这个,然后看到了这个问题,我就想用一下,结果我用我写的语句,它就出现这种情况了,我就不清楚这什么原因了。
 
你直接运行就知道能不能运行到哪一句了三你在窗体上加一个 TMemo 控件三直接使用那一个地址试试三Memo1.Lines.Add(PChar(dms1.memory)^);
 
// to: 382956061 能使用var dms1 : TMemoryStream; dms : TFileStream; tbyte1: pchar; tbyte: pbyte; path : string; filename : string;begin path := 'C:/Documents and Settings/user01.Q/桌面/' ; filename := path + 'fgf.txt'; // 这一句 fgf.txt 你用的是 fgf .txt 不晓得是不是这个原因 try try dms := TFileStream.Create(filename,0); tbyte := PByte(dms.Size); dms1 := TMemoryStream.Create; dms1.LoadFromStream(dms); // filename := path +'11.txt'; // dms1.SaveToFile(filename); tbyte1 := PChar(dms1.memory); Memo1.Lines.Add(tbyte1^); tbyte1 := tbyte1 + 1; Memo1.Lines.Add(tbyte1^); dms1.SaveToFile(path+'1.txt'); except on e: Exception do ShowMessage(e.Message); end; finally dms.Free; dms1.Free; end;end; //为什么不使用 TMemoryStream//毕竟 TMemoryStream 打开文件也是用的 TFileStream
 
哎哎。大侠们。是我出问题放分耶。怎么在这里讨论别的了。用文件流的内存映射已经解决了。在问新问题。怎么把大的文件。通过内存映射快速完整的复制到小的文件。比如600M的文件复制到100MD 文件。100M的复制到600M的里面去已解决。600M的复制到100M的只能复制100M剩余500M的内容复制不了。问题就是怎么吧100M的内存映射自动扩充到600M好自动复制全部的数据
 
问问题另外开个帖子了,太不厚道了,原来问题解决了就该放分了
 
后退
顶部