/**************************************************************************************************************
  * Extract ISO 9660
  *************************************************************************************************************/
 private void ExtractDirectoryISO9660(DiscDirectoryInfo Dinfo, string RootPath, string PathinISO)
 {
     try
     {
         if (!string.IsNullOrWhiteSpace(PathinISO))
         {
             PathinISO += "\\" + Dinfo.Name;
         }
         RootPath += "\\" + Dinfo.Name;
         AppendDirectoryISO9660(RootPath);
         foreach (DiscDirectoryInfo dinfo in Dinfo.GetDirectories())
         {
             ExtractDirectoryISO9660(dinfo, RootPath, PathinISO);
         }
         foreach (DiscFileInfo finfo in Dinfo.GetFiles())
         {
             using (Stream FileStr = finfo.OpenRead())
             {
                 using (FileStream Fs = File.Create(RootPath + "\\" + finfo.Name)) // Here you can Set the BufferSize Also e.g. File.Create(RootPath + "\\" + finfo.Name, 4 * 1024)
                 {
                     FileStr.CopyTo(Fs, 4 * 1024);                                 // Buffer Size is 4 * 1024 but you can modify it in your code as per your need
                 }
             }
         }
     }
     catch (Exception oEx)
     {
         BootmanLog.LogError(LogTextBox, "Error Extracting ISO: " + oEx.Message);
     }
 }
        /**************************************************************************************************************
         * Extract ISO 9660
         *************************************************************************************************************/
        public bool CreateISO9660(string in_sISOPathAndFilename
                                  , string in_sISORootSourceRootDir)
        {
            try
            {
                CDBuilder oISOBuilder = new CDBuilder();
                oISOBuilder.UseJoliet        = true;
                oISOBuilder.VolumeIdentifier = "A_SAMPLE_DISK";
                string sISOPathAndFilename = in_sISOPathAndFilename;

                // Add Files to ISO
                bool bResultAddFiles = AddFilesToISO9660(in_sISORootSourceRootDir
                                                         , ""
                                                         , oISOBuilder
                                                         , false);

                if (bResultAddFiles)
                {
                    // Build the ISO
                    oISOBuilder.Build(sISOPathAndFilename);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            catch (Exception oEx)
            {
                BootmanLog.LogError(LogTextBox, "Error Extracting ISO: " + oEx.Message);
                return(false);
            }
        }
        public bool CreateDiskPartWorkFile(string in_sUsbDriveLetter
                                           , int in_iDriveNumber
                                           , string in_sWorkAreaPath
                                           )
        {
            try
            {
                // Create directory
                string sDiskPartWorkFile = Path.Combine(in_sWorkAreaPath, "DiskPartWorkFile.txt");

                using (System.IO.FileStream oFileStream = System.IO.File.Create(sDiskPartWorkFile))
                {
                    StreamWriter oStreamWriter = new StreamWriter(oFileStream);

                    //select disk
                    oStreamWriter.WriteLine("select disk " + in_iDriveNumber);
                    oStreamWriter.WriteLine("");

                    //clean
                    oStreamWriter.WriteLine("clean");
                    oStreamWriter.WriteLine("");

                    //create partition primary
                    oStreamWriter.WriteLine("create part pri");
                    oStreamWriter.WriteLine("");

                    //select partition
                    oStreamWriter.WriteLine("select part 1");
                    oStreamWriter.WriteLine("");

                    //format
                    oStreamWriter.WriteLine("format fs=ntfs quick");
                    oStreamWriter.WriteLine("");

                    //make active
                    oStreamWriter.WriteLine("active");
                    oStreamWriter.WriteLine("");

                    //assign
                    oStreamWriter.WriteLine("assign letter=" + in_sUsbDriveLetter);
                    oStreamWriter.WriteLine("");

                    oStreamWriter.Dispose();
                }
                return(true);
            }
            catch (Exception oEx)
            {
                BootmanLog.LogError(LogTextBox, "Error: " + oEx.Message);

                return(false);
            }
        }
        /**************************************************************************************************************
         * ISO Extract
         *************************************************************************************************************/
        public bool ExtractISO(string in_sIsoPathAndFileName
                               , string in_sIsoExtractionRootDir
                               , bool in_bCreateSubdirectory)
        {
            try
            {
                using (FileStream ISOStream = File.Open(in_sIsoPathAndFileName, FileMode.Open))
                {
                    DiscUtils.FileSystemManager oMgr           = new FileSystemManager();
                    DiscUtils.FileSystemInfo[]  oFileInfoItems = oMgr.DetectFileSystems(ISOStream);

                    bool bIsUDF = false;
                    foreach (DiscUtils.FileSystemInfo oInfo in oFileInfoItems)
                    {
                        string sDesc = oInfo.Description;

                        if (sDesc == "OSTA Universal Disk Format (UDF)")
                        {
                            bIsUDF = true;
                        }
                    }

                    string sIsoExtractionPath = "";

                    if (in_bCreateSubdirectory)
                    {
                        // Extract to subdirectory on drive
                        sIsoExtractionPath
                            = Path.Combine(in_sIsoExtractionRootDir, Path.GetFileNameWithoutExtension(in_sIsoPathAndFileName));
                    }
                    else
                    {
                        // Extract to ISO Extraction Root directory
                        sIsoExtractionPath = in_sIsoExtractionRootDir;
                    }

                    if (bIsUDF)
                    {
                        BootmanLog.LogError(LogTextBox, "Processing ISO Extract as ISO-UDF");

                        UdfReader oUDFReader = new UdfReader(ISOStream);
                        ExtractDirectoryISOUDF(oUDFReader.Root
                                               , sIsoExtractionPath
                                               , "");
                        oUDFReader.Dispose();
                        return(true);
                    }
                    else
                    {
                        BootmanLog.LogError(LogTextBox, "Processing ISO Extract as ISO-9660");

                        CDReader oISO9660Reader = new CDReader(ISOStream, true, true);
                        ExtractDirectoryISO9660(oISO9660Reader.Root
                                                , sIsoExtractionPath
                                                , "");
                        oISO9660Reader.Dispose();
                        return(true);
                    }
                }
            }
            catch (Exception oEx)
            {
                BootmanLog.LogError(LogTextBox, "Error Extracting ISO: " + oEx.Message);
                return(false);
            }
        }
        private bool AddFilesToISO9660(string in_sDirectoryRead
                                       , string in_sDirectoryISO
                                       , CDBuilder in_oISOBuilder
                                       , bool in_bCreateISOSubDirectory)
        {
            try
            {
                string sDirectoryISO = in_sDirectoryISO.Trim();

                if (System.IO.Directory.Exists(in_sDirectoryRead))
                {
                    // Create new ISO Subdirectory
                    if (in_bCreateISOSubDirectory)
                    {
                        in_oISOBuilder.AddDirectory(sDirectoryISO);
                    }

                    System.IO.DirectoryInfo oDirInfo = new DirectoryInfo(in_sDirectoryRead);

                    // Copy the files and overwrite destination files if they already exist.
                    foreach (FileInfo oFileInfo in oDirInfo.GetFiles())
                    {
                        // Add File to ISO
                        try
                        {
                            if (Properties.Settings.Default.DebugOn)
                            {
                                BootmanLog.LogError(LogTextBox
                                                    , "ISO Create Add: >> " + sDirectoryISO + "\\" + oFileInfo.Name);
                            }

                            in_oISOBuilder.AddFile(sDirectoryISO + "\\" + oFileInfo.Name
                                                   , oFileInfo.FullName);
                        }
                        catch (Exception oEx)
                        {
                            BootmanLog.LogError(LogTextBox
                                                , "Error: " + oEx.Message);

                            throw new Exception("Rethrow - " + oEx.Message);
                        }
                    }

                    foreach (DirectoryInfo oSubDirInfo in oDirInfo.GetDirectories())
                    {
                        string sNewDirRead = oSubDirInfo.FullName;

                        string sNewDirISO = "";
                        if (sDirectoryISO.Length > 0)
                        {
                            sNewDirISO = sDirectoryISO + "\\" + oSubDirInfo.Name;
                        }
                        else
                        {
                            sNewDirISO = oSubDirInfo.Name;
                        }

                        // Recursive call
                        bool bRecusiveCallResult = AddFilesToISO9660(sNewDirRead
                                                                     , sNewDirISO
                                                                     , in_oISOBuilder
                                                                     , true);

                        if (!bRecusiveCallResult)
                        {
                            return(false);
                        }
                    }
                    return(true);
                }
                else
                {
                    Console.WriteLine("Source path does not exist!");
                    return(false);
                }
            }
            catch (Exception oEx)
            {
                BootmanLog.LogError(LogTextBox
                                    , "Error: " + oEx.Message);
                return(false);
            }
        }