private async Task GenerateMenuImageAsync(string tempDirectory, string listText, string openmenuListText, bool isRebuilding = false)
        {
            //create hi density track
            var dataPath = Path.Combine(tempDirectory, "data");

            if (!await Helper.DirectoryExistsAsync(dataPath))
            {
                await Helper.CreateDirectoryAsync(dataPath);
            }

            //var isoPath = Path.Combine(tempDirectory, "iso");
            //if (!await Helper.DirectoryExistsAsync(isoPath))
            //    await Helper.CreateDirectoryAsync(isoPath);

            //var isoFilePath = Path.Combine(isoPath, "menu.iso");
            //var isoFilePath = Path.Combine(isoPath, "menu.iso");

            var cdiPath = Path.Combine(tempDirectory, "menu_gdi");//var destinationFolder = Path.Combine(sdPath, "01");

            if (await Helper.DirectoryExistsAsync(cdiPath))
            {
                await Helper.DeleteDirectoryAsync(cdiPath);
            }

            await Helper.CreateDirectoryAsync(cdiPath);

            var cdiFilePath = Path.Combine(cdiPath, "disc.gdi");

            await Helper.CopyDirectoryAsync(Path.Combine(currentAppPath, "tools", "openMenu", "menu_data"), dataPath);

            await Helper.CopyDirectoryAsync(Path.Combine(currentAppPath, "tools", "openMenu", "menu_gdi"), cdiPath);

            /* Write to low density */
            await Helper.WriteTextFileAsync(Path.Combine(tempDirectory, "LIST.INI"), listText);

            await Helper.WriteTextFileAsync(Path.Combine(tempDirectory, "OPENMENU.INI"), openmenuListText);

            /* Write to high density */
            await Helper.WriteTextFileAsync(Path.Combine(dataPath, "LIST.INI"), listText);

            await Helper.WriteTextFileAsync(Path.Combine(dataPath, "OPENMENU.INI"), openmenuListText);

            /*@Debug*/
            await Helper.WriteTextFileAsync(Path.Combine(currentAppPath, "LIST.INI"), listText);

            await Helper.WriteTextFileAsync(Path.Combine(currentAppPath, "OPENMENU.INI"), openmenuListText);

            //generate menu gdi
            var builder = new DiscUtils.Gdrom.GDromBuilder()
            {
                RawMode          = false,
                TruncateData     = true,
                VolumeIdentifier = "OPENMENU"
            };
            //builder.ReportProgress += ProgressReport;

            //create low density track
            List <FileInfo> fileList = new List <FileInfo>();

            fileList.Add(new FileInfo(Path.Combine(tempDirectory, "LIST.INI")));
            fileList.Add(new FileInfo(Path.Combine(tempDirectory, "OPENMENU.INI")));

            builder.CreateFirstTrack(Path.Combine(cdiPath, "track01.iso"), fileList);

            var updatetDiscTracks = builder.BuildGDROM(dataPath, ipbinPath, new List <string> {
                Path.Combine(cdiPath, "track04.raw")
            }, cdiPath);                                                                                                                        //todo await

            builder.UpdateGdiFile(updatetDiscTracks, cdiFilePath);

            if (ItemList.First().Ip.Name == "GDMENU" || ItemList.First().Ip.Name == "openMenu")
            {
                //long start;
                //GetIpData(cdiFilePath, out long fileLength);

                var item = ItemList[0];

                //item.CdiTarget = start;

                if (isRebuilding)
                {
                    return;
                }

                //if user's menu is not in GDI format, update to GDI format.
                if (!Path.GetExtension(item.ImageFile).Equals(".gdi", StringComparison.OrdinalIgnoreCase))
                {
                    item.ImageFiles.Clear();
                    var gdi = await ImageHelper.CreateGdItemAsync(cdiPath);

                    item.ImageFiles.AddRange(gdi.ImageFiles);
                }

                item.FullFolderPath = cdiPath;
                item.ImageFiles[0]  = Path.GetFileName(cdiFilePath);
                //item.RenameImageFile(Path.GetFileName(cdiFilePath));

                item.SdNumber = 0;
                item.Work     = WorkMode.New;
            }
            else if (!isRebuilding)
            {
                ItemList.Insert(0, await ImageHelper.CreateGdItemAsync(cdiPath));
            }
        }
        private async Task GenerateMenuImageAsync(string tempDirectory, string listText, bool isRebuilding = false)
        {
            //create hi density track
            var dataPath = Path.Combine(tempDirectory, "data");

            if (!await Helper.DirectoryExistsAsync(dataPath))
            {
                await Helper.CreateDirectoryAsync(dataPath);
            }

            //var isoPath = Path.Combine(tempDirectory, "iso");
            //if (!await Helper.DirectoryExistsAsync(isoPath))
            //    await Helper.CreateDirectoryAsync(isoPath);

            //var isoFilePath = Path.Combine(isoPath, "menu.iso");
            //var isoFilePath = Path.Combine(isoPath, "menu.iso");

            var cdiPath = Path.Combine(tempDirectory, "menu_gdi");//var destinationFolder = Path.Combine(sdPath, "01");

            if (await Helper.DirectoryExistsAsync(cdiPath))
            {
                await Helper.DeleteDirectoryAsync(cdiPath);
            }

            await Helper.CreateDirectoryAsync(cdiPath);

            var cdiFilePath = Path.Combine(cdiPath, "disc.gdi");

            await Helper.CopyDirectoryAsync(Path.Combine(currentAppPath, "tools", "menu_data"), dataPath);

            await Helper.CopyDirectoryAsync(Path.Combine(currentAppPath, "tools", "menu_gdi"), cdiPath);

            await Helper.WriteTextFileAsync(Path.Combine(tempDirectory, "LIST.INI"), listText);

            //generate menu gdi
            var builder = new DiscUtils.Gdrom.GDromBuilder()
            {
                RawMode          = false,
                TruncateData     = true,
                VolumeIdentifier = "GDMENU"
            };

            //builder.ReportProgress += ProgressReport;

            //create low density track
            builder.CreateFirstTrack(Path.Combine(cdiPath, "track01.iso"), new FileInfo(Path.Combine(tempDirectory, "LIST.INI")));



            var updatetDiscTracks = builder.BuildGDROM(dataPath, ipbinPath, new List <string> {
                Path.Combine(cdiPath, "track04.raw")
            }, cdiPath);                                                                                                                        //todo await

            builder.UpdateGdiFile(updatetDiscTracks, cdiFilePath);

            if (ItemList.First().Ip.Name == "GDMENU")
            {
                //long start;
                //GetIpData(cdiFilePath, out long fileLength);

                var item = ItemList[0];

                //item.CdiTarget = start;

                if (isRebuilding)
                {
                    return;
                }

                item.FullFolderPath = cdiPath;
                item.ImageFiles[0]  = Path.GetFileName(cdiFilePath);
                //item.RenameImageFile(Path.GetFileName(cdiFilePath));

                item.SdNumber = 0;
                item.Work     = WorkMode.New;
            }
            else if (!isRebuilding)
            {
                ItemList.Insert(0, await ImageHelper.CreateGdItemAsync(cdiPath));
            }
        }