ISOUnit.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:8k
源码类别:

DVD

开发平台:

Delphi

  1. unit ISOUnit;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   Menus, ExtCtrls, ComCtrls, StdCtrls, ISOImage, ISO9660ImageTree,
  6.   ImgList,Resources;
  7. type
  8.   TISOForm = class(TForm)
  9.     StatusBar1: TStatusBar;
  10.     MainMenu1: TMainMenu;
  11.     mm_File: TMenuItem;
  12.     sm_File_Open: TMenuItem;
  13.     sm_File_Close: TMenuItem;
  14.     sm_File_Break1: TMenuItem;
  15.     sm_File_Quit: TMenuItem;
  16.     dlg_OpenImage: TOpenDialog;
  17.     SaveDialog1: TSaveDialog;
  18.     sm_File_SaveAs: TMenuItem;
  19.     ImageList1: TImageList;
  20.     Panel1: TPanel;
  21.     mem_DebugOut: TMemo;
  22.     tv_Directory: TTreeView;
  23.     Panel2: TPanel;
  24.     VolIDEdit: TEdit;
  25.     Label1: TLabel;
  26.     PopupMenu1: TPopupMenu;
  27.     CreateDirctory1: TMenuItem;
  28.     N2: TMenuItem;
  29.     DeleteDirectory1: TMenuItem;
  30.     AddFile1: TMenuItem;
  31.     OpenDialog2: TOpenDialog;
  32.     NewISOImage1: TMenuItem;
  33.     N1: TMenuItem;
  34.     SaveDVDImageas1: TMenuItem;
  35.     Procedure ISOStatus(CurrentStatus:String);
  36.     procedure sm_File_QuitClick(Sender: TObject);
  37.     procedure sm_File_OpenClick(Sender: TObject);
  38.     procedure FormCreate(Sender: TObject);
  39.     procedure FormDestroy(Sender: TObject);
  40.     procedure tv_DirectoryDblClick(Sender: TObject);
  41.     procedure sm_File_CloseClick(Sender: TObject);
  42.     procedure tv_DirectoryChange(Sender: TObject; Node: TTreeNode);
  43.     procedure Image1Click(Sender: TObject);
  44.     procedure CheckDirs1Click(Sender: TObject);
  45.     procedure sm_File_SaveAsClick(Sender: TObject);
  46.     procedure CreateDirctory1Click(Sender: TObject);
  47.     procedure AddFile1Click(Sender: TObject);
  48.     procedure DeleteDirectory1Click(Sender: TObject);
  49.     procedure SaveDVDImageas1Click(Sender: TObject);
  50.   private
  51.     TreeObj : TObject;
  52.     FISOImage  : TISOImage;
  53.     Procedure  BuildStructureTree(ATV: TTreeView; RootNode : TTreeNode; ADirEntry : TDirectoryEntry);
  54.   public
  55.     ISOFilename : String;
  56.   end;
  57. var
  58.   ISOForm: TISOForm;
  59. implementation
  60. {$R *.DFM}
  61. procedure TISOForm.ISOStatus(CurrentStatus:String);
  62. begin
  63.    mem_debugout.Lines.Add(CurrentStatus);
  64. end;
  65. procedure TISOForm.sm_File_QuitClick(Sender: TObject);
  66. begin
  67.   Close;
  68. end;
  69. procedure TISOForm.sm_File_OpenClick(Sender: TObject);
  70. Var
  71.   Node : TTreeNode;
  72. begin
  73.   If ( dlg_OpenImage.Execute ) Then
  74.   Begin
  75.     If ( Assigned(FISOImage) ) Then  FreeAndNil(FISOImage);
  76.     mem_DebugOut.Clear;
  77.     tv_Directory.Items.Clear;
  78.     FISOImage := TISOImage.Create;
  79.     Try
  80.       FISOImage.Filename := dlg_OpenImage.FileName;
  81.       FISOImage.OnISOStatus := ISOStatus;
  82.       FISOImage.OpenImage;
  83.       Node := tv_Directory.Items.Add(Nil, FISOImage.Volume_ID+'/');
  84.       Node.Data := fISOImage.Structure.RootDirectory;
  85.       BuildStructureTree(tv_Directory, Node, FISOImage.Structure.RootDirectory);
  86.       sm_File_SaveAs.Enabled := True;
  87.       sm_File_Close.Enabled := True;
  88.     Except
  89.          mem_DebugOut.Lines.Add('Exception: ' + Exception(ExceptObject).ClassName + ' -> ' + Exception(ExceptObject).Message);
  90.       Raise;
  91.     End;
  92.   End;
  93. end;
  94. procedure TISOForm.FormCreate(Sender: TObject);
  95. begin
  96.   fISOImage := Nil;   // not necessary, but safety first...
  97. end;
  98. procedure TISOForm.FormDestroy(Sender: TObject);
  99. begin
  100.   If ( Assigned(fISOImage) ) Then FreeAndNil(fISOImage);
  101. end;
  102. procedure TISOForm.tv_DirectoryDblClick(Sender: TObject);
  103. Var
  104.   Node : TTreeNode;
  105.   Obj  : TObject;
  106. begin
  107.   Node := TTreeView(Sender).Selected;
  108.   If Assigned(Node.Data) Then
  109.   Begin
  110.     Obj := TObject(Node.Data);
  111.     If ( Obj Is TFileEntry ) And ( SaveDialog1.Execute ) Then
  112.       fISOImage.ExtractFile(TFileEntry(Obj), SaveDialog1.FileName);
  113.   End;
  114. end;
  115. Procedure TISOForm.BuildStructureTree(ATV: TTreeView; RootNode : TTreeNode; ADirEntry : TDirectoryEntry);
  116. Var
  117.   i : Integer;
  118.   Node : TTreeNode;
  119.   Dir  : TDirectoryEntry;
  120.   Fil  : TFileEntry;
  121. Begin
  122.   For i:=0 To ADirEntry.DirectoryCount-1 Do
  123.   Begin
  124.     Dir := ADirEntry.Directories[i];
  125.     Node := ATV.Items.AddChild(RootNode, Dir.Name + '/');
  126.     Node.ImageIndex := 1;
  127.     Node.SelectedIndex := 1;
  128.     Node.Data := Pointer(Dir);
  129.     BuildStructureTree(ATV, Node, Dir);
  130.   End;
  131.   For i:=0 To ADirEntry.FileCount-1 Do
  132.   Begin
  133.     Fil := ADirEntry.Files[i];
  134.     Node := ATV.Items.AddChild(RootNode, Fil.Name);
  135.     Node.ImageIndex := 2;
  136.     Node.SelectedIndex := 2;
  137.     Node.Data := Pointer(Fil);
  138.   End;
  139. End;
  140. procedure TISOForm.sm_File_CloseClick(Sender: TObject);
  141. begin
  142.   If ( Assigned(fISOImage) ) Then fISOImage.CloseImage;
  143.   sm_File_Close.Enabled  := False;
  144.   sm_File_SaveAs.Enabled := False;
  145. end;
  146. procedure TISOForm.tv_DirectoryChange(Sender: TObject; Node: TTreeNode);
  147. begin
  148.   If Assigned(Node) Then
  149.   Begin
  150.     TreeObj := TObject(Node.Data);
  151.  End;
  152. end;
  153. procedure TISOForm.Image1Click(Sender: TObject);
  154. var
  155.      DirEntry : TDirectoryEntry;
  156.      FileEntry : TFileEntry;
  157. begin
  158.     If ( Assigned(FISOImage) ) Then FreeAndNil(FISOImage);
  159.     FISOImage := TISOImage.Create;
  160.     FISOImage.OnISOStatus := ISOStatus;
  161.     CheckDirs1Click(nil);
  162. end;
  163. procedure TISOForm.CheckDirs1Click(Sender: TObject);
  164. Var
  165.   Node : TTreeNode;
  166. begin
  167.     tv_Directory.Items.Clear;
  168.     Try
  169.       Node := tv_Directory.Items.Add(Nil, '/');
  170.       Node.ImageIndex := 0;
  171.       Node.Data := FISOImage.Structure.RootDirectory;
  172.       BuildStructureTree(tv_Directory, Node, fISOImage.Structure.RootDirectory);
  173.       tv_Directory.Items[0].Expand(true);
  174.     Except
  175.       mem_DebugOut.Lines.Add('Exception: ' + Exception(ExceptObject).ClassName + ' -> ' + Exception(ExceptObject).Message);
  176.       Raise;
  177.     End;
  178. end;
  179. procedure TISOForm.sm_File_SaveAsClick(Sender: TObject);
  180. begin
  181.     savedialog1.Title := resFileDialogTitle;
  182.     if savedialog1.execute then
  183.     begin
  184.        ISOFilename := savedialog1.filename;
  185.        FISOImage.Filename := ISOFilename;
  186.        FISOImage.Volume_ID := VolIDEdit.text;
  187.        FISOImage.SaveImageToDisk(1);
  188.        ShowMessage(resISOSaved);
  189.     end;
  190. end;
  191. procedure TISOForm.CreateDirctory1Click(Sender: TObject);
  192. var
  193.         DirName : String;
  194.         DirEntry : TDirectoryEntry;
  195. begin
  196.     If Assigned(TreeObj) Then
  197.     Begin
  198.       If ( TreeObj Is TDirectoryEntry ) Then
  199.       Begin
  200.         DirEntry := TDirectoryEntry(TreeObj);
  201.         DirName := InputBox('New Dir : ','Dir : ','');
  202.         if DirName <> '' then
  203.         begin
  204.            DirEntry := TDirectoryEntry.Create(FISOImage.Structure,DirEntry,dsfFromImage);
  205.            DirEntry.Name := DirName;
  206.         end;   
  207.         CheckDirs1Click(nil);
  208.       End;
  209.     End;
  210. end;
  211. procedure TISOForm.AddFile1Click(Sender: TObject);
  212. var
  213.         DirName : String;
  214.         DirEntry : TDirectoryEntry;
  215.         FileEntry : TFileEntry;
  216. begin
  217.     If Assigned(TreeObj) Then
  218.     Begin
  219.       If ( TreeObj Is TDirectoryEntry ) Then
  220.       Begin
  221.         DirEntry := TDirectoryEntry(TreeObj);
  222.         if OpenDialog2.execute then
  223.         begin
  224.            FileEntry := TFileEntry.Create(DirEntry,dsfFromLocal);
  225.            FileEntry.Name := ExtractFilename(Opendialog2.filename);
  226.            FileEntry.SourceFileName := Opendialog2.filename;
  227.         end;
  228.         CheckDirs1Click(nil);
  229.       End;
  230.     End;
  231. end;
  232. procedure TISOForm.DeleteDirectory1Click(Sender: TObject);
  233. var
  234.         DirName : String;
  235.         DirEntry : TDirectoryEntry;
  236. begin
  237.     If Assigned(TreeObj) Then
  238.     Begin
  239.       If ( TreeObj Is TDirectoryEntry ) Then
  240.       Begin
  241.         DirEntry := TDirectoryEntry(TreeObj).Parent;
  242.         DirEntry.DelDirectory(TDirectoryEntry(TreeObj));
  243.         CheckDirs1Click(nil);
  244.       End;
  245.     End;
  246. end;
  247. procedure TISOForm.SaveDVDImageas1Click(Sender: TObject);
  248. begin
  249.     savedialog1.Title := resFileDialogTitle;
  250.     if savedialog1.execute then
  251.     begin
  252.        ISOFilename := savedialog1.filename;
  253.        FISOImage.Filename := ISOFilename;
  254.        FISOImage.Volume_ID := VolIDEdit.text;
  255.        FISOImage.SaveDVDImageToDisk;
  256.        ShowMessage(resISOSaved);
  257.     end;
  258. end;
  259. end.