Как читать компакт-диск в виде файла?

Я хочу знать, возможно ли в Delphi читать компакт-диск в виде необработанного потока прямо с устройства логического диска "C: \".

Надеюсь, я смогу использовать TFileStream, если у меня уже есть допустимый дескриптор файла.

Ответ 1

Проще всего использовать 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 могут быть совсем другими.