2012-02-06 55 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