2012-02-06 74 views
11

我想知道在Delphi中是否可以直接从逻辑磁盘驱动器设备“C:\”中将CD作为原始流读取。如何将CD作为文件读取?

我希望我可以使用TFileStream,如果我已经有一个有效的文件句柄。

+4

-1你的问题似乎对我很模糊。更新你的问题,说明你想如何处理CD上的数据。 – 2012-02-06 11:46:03

+0

@ Styne666:我怎样才能以这种或那种方式访问​​数据?我强烈的信念是通过逻辑文件访问它(整个物理媒体,我的意思是)要走的路。即使使用“数据”这个术语也是令人困惑的,这可能导致人们考虑文件系统。 – menjaraz 2012-02-06 11:56:05

+0

这是我的观点。说“将CD作为文件读取”是含糊的。澄清这个问题,所以有**没有歧义**。 – 2012-02-06 12:15:46

回答

11

在我看来,最容易使用THandleStream而不是TFileStream。像这样:

procedure ReadFirstSector; 
var 
    Handle: THandle; 
    Stream: THandleStream; 
    Buffer: array [1..512] of Byte; 
    b: Byte; 
begin 
    Handle := CreateFile('\\.\C:', GENERIC_READ, 
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
    if Handle=INVALID_HANDLE_VALUE then 
    RaiseLastOSError; 
    try 
    Stream := THandleStream.Create(Handle); 
    try 
     Stream.ReadBuffer(Buffer, SizeOf(Buffer)); 
     for b in Buffer do 
     Writeln(AnsiChar(b)); 
    finally 
     Stream.Free; 
    end; 
    finally 
    CloseHandle(Handle); 
    end; 
end; 

请注意,当使用原始磁盘访问时,您必须精确读取多个扇区。我测试过的磁盘上的扇区大小为512字节。我预计CD盘领域可能会有不同的规模。

+0

所以模式是'\\。\ DRIVELETTER:',我说得对吗?请给我一个额外的好处:我不是母语的人,如果它很混乱,你能否给我一个提示,以改善我的帖子(这是在发布之后立即下线)? – menjaraz 2012-02-06 12:16:05

+0

物理卷命名在这里描述:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858.aspx#physical_disks_and_volumes我没有理解你的帖子(我认为)的问题。有时候,你会从不明白你的意思的人那里得到赞扬,因为他们可能缺乏一些知识。对此你可以做的不多。别担心。我现在会给你一个upvote! – 2012-02-06 12:41:32

+2

@大卫,当答案取决于未提供的信息时,有时候人们会对不完整的问题进行投票。 – 2012-02-06 13:11:58