Delphi 如何在德尔福阅读ISO9660?

Delphi 如何在德尔福阅读ISO9660?,delphi,iso9660,Delphi,Iso9660,我目前正在做一个项目,需要知道DVD是什么时候刻录的(DVD刻录的日期)。就我搜索和查找而言,发现所有类似的数据都遵循ISO 9660格式,但我找不到如何访问或读取它,还尝试了一些组件包和相关的库,但它们都没有按照我的预期和需要工作 也找到了这个链接:但是我找不到在Delphi中使用它们的方法。 它是如何工作的?下面是指向此答案的链接:提供从何处读取磁盘上的日期和时间信息: 读取16个字符加上从位置33582开始的一个额外字节,则DVD创建时间为: YYYYMMDDHMMSSCCO 其中CC为厘

我目前正在做一个项目,需要知道DVD是什么时候刻录的(DVD刻录的日期)。就我搜索和查找而言,发现所有类似的数据都遵循ISO 9660格式,但我找不到如何访问或读取它,还尝试了一些组件包和相关的库,但它们都没有按照我的预期和需要工作

也找到了这个链接:但是我找不到在Delphi中使用它们的方法。
它是如何工作的?

下面是指向此答案的链接:提供从何处读取磁盘上的日期和时间信息:

读取16个字符加上从位置33582开始的一个额外字节,则DVD创建时间为:

YYYYMMDDHMMSSCCO

其中CC为厘米秒,O为15分钟间隔内与GMT的偏移量,存储为8位整数(2的补码表示)

以下代码可用于读取(另请参阅):

函数GetDVDCreationDate:String; //ISO9660光盘上的扇区大小为2048 常数 扇区大小=2048; rdPos=(33582分区扇区大小);//33582 rdOfs=(33582模块扇区大小)-1; 变量 RawMBR:字节的数组[0..sector_size-1]; btsIO:DWORD; 设备:THandle; i:整数; GMTofs:ShortInt; 开始 结果:=''; hDevice:=CreateFile('\\.\E:',GENERIC\u READ,//选择驱动器 文件共享读取或文件共享写入,无, 打开\u现有,文件\u属性\u正常,0); 如果hDevice的句柄值无效,则 开始 SetFilePointer(hDevice,扇区大小*rdPos,nil,文件开始); ReadFile(hDevice,RawMBR[0],扇区大小,btsIO,nil); 如果(btsIO=扇区大小),则开始 对于i:=0到15,开始 结果:=Result+AnsiChar(RawMBR[rdOfs+i]); 终止 GMTofs:=ShortInt(RawMBR[rdOfs+16]);//如果重要,请处理GMT偏移 终止 闭合手柄(hDevice); 终止 终止

请注意,从光盘读取原始数据必须从扇区大小均匀的位置开始。对于磁盘,扇区大小为2048。

下面是指向此答案的链接:提供了读取磁盘上日期和时间信息的位置:

读取16个字符加上从位置33582开始的一个额外字节,则DVD创建时间为:

YYYYMMDDHMMSSCCO

其中CC为厘米秒,O为15分钟间隔内与GMT的偏移量,存储为8位整数(2的补码表示)

以下代码可用于读取(另请参阅):

函数GetDVDCreationDate:String; //ISO9660光盘上的扇区大小为2048 常数 扇区大小=2048; rdPos=(33582分区扇区大小);//33582 rdOfs=(33582模块扇区大小)-1; 变量 RawMBR:字节的数组[0..sector_size-1]; btsIO:DWORD; 设备:THandle; i:整数; GMTofs:ShortInt; 开始 结果:=''; hDevice:=CreateFile('\\.\E:',GENERIC\u READ,//选择驱动器 文件共享读取或文件共享写入,无, 打开\u现有,文件\u属性\u正常,0); 如果hDevice的句柄值无效,则 开始 SetFilePointer(hDevice,扇区大小*rdPos,nil,文件开始); ReadFile(hDevice,RawMBR[0],扇区大小,btsIO,nil); 如果(btsIO=扇区大小),则开始 对于i:=0到15,开始 结果:=Result+AnsiChar(RawMBR[rdOfs+i]); 终止 GMTofs:=ShortInt(RawMBR[rdOfs+16]);//如果重要,请处理GMT偏移 终止 闭合手柄(hDevice); 终止 终止

请注意,从光盘读取原始数据必须从扇区大小均匀的位置开始。对于磁盘,扇区大小为2048。

多亏了@LU RD answer,下面是他的代码,只做了一些很小的修改:

function GetDVDCreationDate(sectorSize:integer): String;
// Sector size is 2048 on ISO9660 optical data discs
var
  RawMBR  : array [0..2047] of byte;
  btsIO   : DWORD;
  hDevice : THandle;
  i       : Integer;
  GMTofs  : ShortInt;
  rdPos, rdOfs: integer;

begin
  rdPos := (33582 DIV sectorSize);  // 33582
  rdOfs := (33582 MOD sectorSize) - 1;

  hDevice := CreateFile('\\.\H:', GENERIC_READ,  // Select drive
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hDevice <> INVALID_HANDLE_VALUE then
  begin
    SetFilePointer(hDevice,sectorSize * rdPos,nil,FILE_BEGIN);
    ReadFile(hDevice, RawMBR[0], sectorSize, btsIO, nil);
    for i := 0 to 15 do begin
      Result := Result + AnsiChar(RawMBR[rdOfs+i]);
    end;
    GMTofs := ShortInt(RawMBR[rdOfs+16]);  // Handle GMT offset if important
    CloseHandle(hDevice);
  end;
end;

//------------------------------------------------------------------------------

procedure Tfrm_main.btn_creationReadClick(Sender: TObject);
begin
  memo_dataLog.Lines.Add(GetDVDCreationDate(StrToInt(edit_sSize.Text)))
end;
函数GetDVDCreationDate(sectorSize:integer):字符串; //ISO9660光盘上的扇区大小为2048 变量 RawMBR:字节数组[0..2047]; btsIO:DWORD; 设备:THandle; i:整数; GMTofs:ShortInt; rdPos,rdOfs:整数; 开始 rdPos:=(33582分区大小);//33582 rdOfs:=(33582 MOD sectorSize)-1; hDevice:=CreateFile('\\.\H:',GENERIC\u READ,//选择驱动器 文件共享读取或文件共享写入,无, 打开\u现有,文件\u属性\u正常,0); 如果hDevice的句柄值无效,则 开始 SetFilePointer(hDevice,sectorSize*rdPos,nil,FILE_BEGIN); ReadFile(hDevice,RawMBR[0],sectorSize,btsIO,nil); 对于i:=0到15,开始 结果:=Result+AnsiChar(RawMBR[rdOfs+i]); 终止 GMTofs:=ShortInt(RawMBR[rdOfs+16]);//如果重要,请处理GMT偏移 闭合手柄(hDevice); 终止 终止 //------------------------------------------------------------------------------ 程序Tfrm_main.btn_creationReadClick(发送方:TObject); 开始 memo_dataLog.Lines.Add(GetDVDCreationDate(stroint(edit_sSize.Text))) 终止
多亏了@LU RD answer,以下是他的代码,只做了一些很小的修改:

function GetDVDCreationDate(sectorSize:integer): String;
// Sector size is 2048 on ISO9660 optical data discs
var
  RawMBR  : array [0..2047] of byte;
  btsIO   : DWORD;
  hDevice : THandle;
  i       : Integer;
  GMTofs  : ShortInt;
  rdPos, rdOfs: integer;

begin
  rdPos := (33582 DIV sectorSize);  // 33582
  rdOfs := (33582 MOD sectorSize) - 1;

  hDevice := CreateFile('\\.\H:', GENERIC_READ,  // Select drive
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hDevice <> INVALID_HANDLE_VALUE then
  begin
    SetFilePointer(hDevice,sectorSize * rdPos,nil,FILE_BEGIN);
    ReadFile(hDevice, RawMBR[0], sectorSize, btsIO, nil);
    for i := 0 to 15 do begin
      Result := Result + AnsiChar(RawMBR[rdOfs+i]);
    end;
    GMTofs := ShortInt(RawMBR[rdOfs+16]);  // Handle GMT offset if important
    CloseHandle(hDevice);
  end;
end;

//------------------------------------------------------------------------------

procedure Tfrm_main.btn_creationReadClick(Sender: TObject);
begin
  memo_dataLog.Lines.Add(GetDVDCreationDate(StrToInt(edit_sSize.Text)))
end;
函数GetDVDCreationDate(sectorSize:integer):字符串; //ISO9660光盘上的扇区大小为2048 变量 RawMBR:字节数组[0..2047]; btsIO:DWORD; 设备:THandle; i:整数; GMTofs:ShortInt; rdPos,rdOfs:整数; 开始 rdPos:=(33582分区大小);//33582 rdOfs:=(33582 MOD sectorSize)-1; hDevice:=CreateFile('\\.\H:',GENERIC\u READ,//选择驱动器 文件共享读取或文件共享写入,无, 打开\u现有,文件\u属性\u正常,0); 如果hDevice的句柄值无效,则 开始 SetFilePointer(hDevice,sectorSize*rdPos,nil,FILE_BEGIN); ReadFile(hDevice,RawMBR[0],sectorSize,btsIO,nil); 对于i:=0到15,开始 结果:=Result+AnsiChar(RawMBR[rdOfs+i]); 终止 GMTofs:=ShortInt(RawMBR[rdOfs+16]);//如果重要,请处理GMT偏移 闭合手柄(hDevice); 终止 终止 //------------------------------------------------------------------------------ 程序Tfrm_main.btn_creationReadClick(发送方:TObject); 开始 memo_dataLog.Lines.Add(GetDVDCreationDate(stroint(edit_sSize.Text))) 终止
一些