📄 mbcdbc.pas
字号:
else
begin
CopyToArray(fn, fd.FileName, L);
fd.LenOfFileIdentifier := l;
ll := -1;
end;
if (p.Attr and faHidden = faHidden) then
fd.FileFlag := fd.FileFlag or 1;
l := l + 33+ELen;
if ELen <> 0 then
SetExt(@fd.FileName[fd.LenOfFileIdentifier+ll], fd.FileFlag, p.Prev, 1);
if bytes - l < 0 then
begin
ISOHeader.Write(ZEROS, bytes);
bytes := DefaultSectorSize - l;
end
else
begin
bytes := bytes - l;
end;
fd.Extended := 0;
fd.LenDr := l;
fd.VolSeqnumber := 1;
fd.VolSeqnumberBE := 256;
if (p.Attr and faDirectory <> faDirectory) and (p.FileSize = 0) then
begin
fd.Address := 0;
fd.AddressBE := 0;
end;
SetDateTime(p.Time, fd);
ISOHeader.Write(fd, l);
p := p.Next;
end;
ISOHeader.Write(ZEROS, bytes);
end;
{******************************************************************************}
{ }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptor(Start, FileStart: Integer);
var
i: Integer;
d: PDirEntry;
begin
for i:=0 to DirCounter-1 do
begin
d := dirs[i];
WriteFileAndDirDescriptor_r(d, Start, FileStart);
end;
end;
{******************************************************************************}
{ }
{******************************************************************************}
function FileAndDirDescriptorWidthJ_r(d: PDirEntry): Integer;
var
l, W, bytes: Integer;
p: PFileEntry;
fn: String;
wfn: WideString;
begin
p := d.Files;
if (d.Files = nil) or (p.LongName <> '.') then
begin
w := 68+ELen+ELen;
bytes := DefaultSectorSize-w;
end
else
begin
bytes := DefaultSectorSize;
w := 0;
end;
while p <> nil do
begin
if (p.Attr and faDirectory <> faDirectory) then
fn := p.LongName+fSuf
else
fn := p.LongName;
wfn := fn;
l := Length(wfn)*2;
if (fn = '.') or (fn = '..') then
l := 1
else if l mod 2 = 0 then
l := l + 1;
l := l + 33+ELen;
if bytes - l < 0 then
begin
w := w + bytes + l;
bytes := DefaultSectorSize - l;
end
else
begin
bytes := bytes - l;
w := w + l;
end;
p := p.Next;
end;
w := w + bytes;
result := Sectors(w)*DefaultSectorSize;
end;
{******************************************************************************}
{ }
{******************************************************************************}
function TMCDBurner.FileAndDirDescriptorWidthJ: Integer;
var
i: Integer;
a, w, ww: Integer;
d: PDirEntry;
begin
ww := 0;
a := 0;
for i:=0 to DirCounter-1 do
begin
d := dirs[i];
w := FileAndDirDescriptorWidthJ_r(d);
ww := ww + w;
d.AddressJ := a;
d.SizeJ := w;
a := a + w div DefaultSectorSize;
end;
result := ww;
end;
{******************************************************************************}
{ }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptorJ_r(d: PDirEntry; Start, FileStart: Integer);
var
l, ll, bytes: Integer;
p: PFileEntry;
fn: String;
wfn: WideString;
fd: TDirectoryDescriptor;
begin
ll := 0;
fillchar(fd, sizeof(fd), 0);
p := d.Files;
fd.FileUnitSize := 0;
fd.InterleaveGap := 0;
if (d.Files = nil) or (p.LongName <> '.') then
begin
fd.LenDr := 34+ELen;
fd.FileName[0] := #0;
fd.LenOfFileIdentifier := 1;
fd.FileFlag := 2;
fd.Address := d.AddressJ+Start;
fd.AddressBE := L2MDW(d.AddressJ+Start);
fd.DataLength := d.SizeJ;
fd.DataLengthBE := L2MDW(d.Size);
fd.VolSeqnumber := 1;
fd.VolSeqnumberBE := 256;
SetDateTime(Now, fd);
if ELen <> 0 then
SetExt(@fd.FileName[0], fd.FileFlag, False, 0);
ISOHeader.write(fd, 34+ELen);
fd.FileName[0] := #1;
fd.Address := d.Parent.AddressJ+Start;
fd.AddressBE := L2MDW(d.Parent.AddressJ+Start);
fd.DataLength := d.Parent.SizeJ;
fd.DataLengthBE := L2MDW(d.Parent.Size);
if ELen <> 0 then
SetExt(@fd.FileName[0], fd.FileFlag, False, 1);
ISOHeader.Write(fd, 34+ELen);
bytes := DefaultSectorSize-(68+ELen+ELen);
end
else
bytes := DefaultSectorSize;
while p <> nil do
begin
fillchar(fd, sizeof(fd), 0);
if (p.Attr and faDirectory <> faDirectory) then
begin
fn := p.LongName+fSuf;
fd.FileFlag := 0;
if not p.Imported then
begin
fd.Address := p.AddressJ+FileStart;
fd.AddressBE := L2MDW(p.AddressJ+FileStart);
end
else
begin
fd.Address := p.AddressJ;
fd.AddressBE := L2MDW(p.AddressJ);
end;
fd.DataLength := p.FileSizeJ;
fd.DataLengthBE := L2MDW(p.FileSizeJ);
end
else
begin
fd.FileFlag := 2;
fn := p.LongName;
fd.Address := p.AddressJ+Start;
fd.AddressBE := L2MDW(p.AddressJ+Start);
fd.DataLength := p.FileSizeJ;
if p.dirRec.SizeJ <> p.FileSizeJ then
begin
//.. error
end;
fd.DataLengthBE := L2MDW(p.FileSizeJ);
end;
wfn := fn;
l := Length(wfn)*2;
if fn = '.' then
begin
l := 1;
fd.FileName[0] := #0;
fd.LenOfFileIdentifier := l;
end
else if fn = '..' then
begin
l := 1;
fd.FileName[0] := #1;
fd.LenOfFileIdentifier := l;
end
else if l mod 2 = 0 then
begin
CopyToArrayW(fn, fd.FileName, L);
fd.FileName[l] := #0;
fd.LenOfFileIdentifier := l;
l := l + 1;
ll := 0;
end
else
begin
CopyToArrayW(fn, fd.FileName, L);
fd.LenOfFileIdentifier := l;
ll := -1;
end;
if (p.Attr and faHidden = faHidden) then
fd.FileFlag := fd.FileFlag or 1;
fd.LenDr := l+ELen;
l := l + 33+ELen;
if ELen <> 0 then
SetExt(@fd.FileName[fd.LenOfFileIdentifier+ll], fd.FileFlag, p.Prev, 1);
if bytes - l < 0 then
begin
ISOHeader.Write(ZEROS, bytes);
bytes := DefaultSectorSize - l;
end
else
begin
bytes := bytes - l;
end;
fd.Extended := 0;
if (l > 230) then
l := l;
fd.LenDr := l;
fd.VolSeqnumber := 1;
fd.VolSeqnumberBE := 256;
SetDateTime(p.Time, fd);
if (p.Attr and faDirectory <> faDirectory) and (p.FileSize = 0) then
begin
fd.Address := 0;
fd.AddressBE := 0;
end;
ISOHeader.Write(fd, l);
p := p.Next;
end;
ISOHeader.Write(ZEROS, bytes);
end;
{******************************************************************************}
{ }
{******************************************************************************}
procedure TMCDBurner.WriteFileAndDirDescriptorJ(Start, FileStart: Integer);
var
i: Integer;
d: PDirEntry;
begin
for i:=0 to DirCounter-1 do
begin
d := dirs[i];
WriteFileAndDirDescriptorJ_r(d, Start, FileStart);
end;
end;
{******************************************************************************}
{ }
{******************************************************************************}
function TMCDBurner.PathTableWidthJ: Integer;
var
i, Len, TotalLen: Integer;
p: PDirEntry;
wfn: WideString;
begin
TotalLen := 10;
for i := 1 to DirCounter-1 do
begin
p := Dirs[i];
wfn := p.LongName;
Len := Length(wfn)*2;
if len mod 2 <> 0 then
Len := len + 1;
Len := Len+8;
Totallen := TotalLen + Len;
end;
iPathTableSizeJ := TotalLen;
result := Sectors(TotalLen)*DefaultSectorSize;
end;
{******************************************************************************}
{ }
{******************************************************************************}
procedure TMCDBurner.WritePathTableJ(Start: Integer; Most: Boolean);
var
i, TotalLen, Len: Integer;
p: PDirEntry;
wfn: WideString;
pt: TPathTableRecord;
begin
TotalLen := 10;
pt.Name[0] := #0;
pt.Name[1] := #0;
pt.ExtAttr := 0;
if Most then
begin
pt.Address := L2MDW(Start);
pt.ParentNumber := LTOMW(1);
end
else
begin
pt.Address := Start;
pt.ParentNumber := 1;
end;
pt.LenDI := 1;
ISOHeader.Write(pt, 10);
for i := 1 to DirCounter-1 do
begin
p := PathTableJ[i];
wfn := p.LongName;
Len := Length(wfn)*2;
CopyToArrayW(p.LongName, pt.Name, Len);
pt.LenDI := Len;
if len mod 2 <> 0 then
begin
Len := len + 1;
pt.Name[Len-1] := #0;
end;
Len := Len+8;
if Most then
begin
pt.Address := L2MDW(p.AddressJ+Start);
pt.ParentNumber := LToMW(p.Parent.Number);
end
else
begin
pt.Address := p.AddressJ+Start;
pt.ParentNumber := p.Parent.Number;
end;
ISOHeader.Write(pt, Len);
Totallen := TotalLen + Len;
end;
if TotalLen - DefaultSectorSize <> 0 then
ISOHeader.Write(ZEROS, DefaultSectorSize-(TotalLen mod DefaultSectorSize));
end;
{******************************************************************************}
{ }
{******************************************************************************}
function TMCDBurner.PathTableWidth: Integer;
var
i, Len, TotalLen: Integer;
p: PDirEntry;
begin
TotalLen := 10;
for i := 1 to DirCounter-1 do
begin
p := Dirs[i];
Len := Length(p.ShortName);
if len mod 2 <> 0 then
Len := len + 1;
Len := Len+8;
Totallen := TotalLen + Len;
end;
iPathTableSize := TotalLen;
result := Sectors(TotalLen)*DefaultSectorSize;
end;
{******************************************************************************}
{ }
{******************************************************************************}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -