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