问题 如何将CD作为文件读取?


我想知道Delphi是否有可能直接从逻辑磁盘驱动器设备“C:\”读取CD作为原始流。

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


3468
2018-02-06 11:31


起源

-1你的问题对我来说似乎含糊不清。更新您的问题,说明您希望如何处理CD上的数据。 - Samuel Harmer
@ Styne666:在以某种方式访问​​数据之前,我如何处理数据?我坚信通过逻辑文件访问它(整个物理媒体,我的意思)是要走的路。即使使用术语“数据”也令人困惑,这可能会让人们想到文件系统。 - menjaraz
这是我的观点。说“将CD作为文件读”是模糊的。澄清这个问题 没有歧义。 - Samuel Harmer
@ Styne666:相信我!你的意见对我很有价值,我对这篇文章的编辑很感激。 - menjaraz
那么一个概念 文件 需要一个 文件系统。你的原始问题没有解释什么 您 用“文件”表示。大多数人通过操作系统的定义从CD访问“文件”的原因是为了避免编写代码来处理CD的文件系统(通常 ISO 9660) - Samuel Harmer


答案:


它最容易使用 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磁盘扇区可能会有不同的大小。


12
2018-02-06 11:53



所以模式是'\\。\ DRIVELETTER:',我是对的吗?请多给我一个帮助:我不是母语人士,你是否可以提出改进我的帖子的提示,如果这是令人困惑的(一旦发布,它是在downvoters的线下)? - menjaraz
此处描述的物理卷命名: msdn.microsoft.com/en-us/library/windows/desktop/...  理解你的帖子我没有问题(我想)。有时候你会从那些不理解你的意思的人那里得到一些赞成票,因为他们可能缺乏一些知识。你无能为力。别担心。我现在给你一个upvote! - David Heffernan
@David,当答案取决于未提供的信息时,有时人们会对不完整的问题投票。 - Samuel Harmer
请注意,这只能可靠地用于数据CD。从音频CD读取数字音频数据是完全不同的野兽。 - afrazier
@ Styne666:你帮我编辑了很多帖子。在这里,一个良好的沟通技巧也受到追捧,并应支付声誉(Upvote / Downvote)。有一天,大卫自己在回答之后编辑了我的帖子,因为它充满了大错。作为一个非本地人,学习英语对我来说是一个持续的过程,并希望仍有改进的空间。 - menjaraz