2009-07-31 85 views
1

缩写形式:是否可以从指针创建流?德尔福中的增量指针/从指针创建流

我有一个指向我需要阅读的文件数据的指针。我使用WriteBuffer()将指针中的数据传输到一个TFileStream,它可以工作。但是现在我想以块的形式阅读它来显示进度条。所以我需要一步一步阅读它。

我不得不选择:

1)增量指针浅黄色,并使用WriteBuffer()如常。 (WriteBuffer总是从头开始读取,因此我需要增加指针)

2)从指针创建一个流。这可能吗?

代码:

var InputStream : TMemoryStream; 
    Buff: Pointer; 


    Header: TOCHeader; 
begin 

// Here I get the pointer 
Size := GetOverlay(Buff); 

// Transfer data to memory stream 
InputStream.WriteBuffer(Buff^, SizeOf(Header)); 

InputStream.Seek(0, soFromBeginning); 

// Read the header 
InputStream.ReadBuffer(Header, SizeOf(Header)); 

// Increment the pointer. Doesn't work :-(. Message Ordinal type required 
Inc(Buff, SizeOf(TOC)); 
+0

您的两个代码的InputStream变量。你们都从中读取并写入。你能澄清吗? – mghie 2009-07-31 10:00:13

+0

哦,对不起。我修正了这个问题。我只是复制了重要的变量和代码短语,而InputStream定义似乎非常重要;-)。 – Simon 2009-07-31 10:20:46

+0

请注意,您需要在写入和读取它之间重置流的位置。您当前的代码会引发异常。 – mghie 2009-07-31 10:33:45

回答

1

当我看到你的问题时,我的脑海里浮现出一个问题。你有一个指向filedata的指针(来自我假设的磁盘),并且你正在使用该指针的数据填充文件流(尽管在你的问题中你正在填充内存流)。为什么不使用TFileStream打开正在阅读的文件?

var 
    FileStream: TFileStream; 
    Header: TOCHeader; 
begin 
    FileStream := TFileStream.Create('c:\fileIWantToRead.txt', fmOpenRead); 
    FileStream.ReadBuffer(Header, SizeOf(Header)); 
    <...> 
end; 

如果你想增加你的指针,则首先将其转换为一个类型的指针,因此编译器知道如何增加你的指针。

Inc(PByte(Buff), SizeOf(TOC)); //sizeof returns size in bytes, so cast pointer to a bytepointer 
2

你可以创建自己的TCustomMemoryStream后代,这在构造函数调用SetPointer(),使用从GetOverlay()接收地址和大小。有关更多信息,请参阅有关TCustomMemoryStream的Delphi文档。

编辑:

那么,这无关你的问题,但在评论你写的,你只希望通过流从运行的可执行文件中读取。这是很容易做到:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    Str: TStream; 
begin 
    Str := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone); 
    try 
    Caption := Format('Size of executable: %u bytes', [Str.Size]); 
    // start to read the contents of the file ... 

    finally 
    Str.Free; 
    end; 
end; 

我会离开原来的答案,万一有人真的想创建一个从指针(只读)流的内存块。