private static void UpdateSysLinux(DirectoryInfo directoryInfo) { foreach (var file in directoryInfo.GetFiles("*", SearchOption.AllDirectories)) { switch (file.Name) { case "chain.c32": break; case "vesamenu.c32": break; case "menu.c32": break; case "libutil.c32": break; case "libcom32.c32": break; case "ifcpu64.c32": break; default: continue; } file.Delete(); WpfUtilities.WriteResourceToFile( new Uri($"pack://application:,,,/Resources/SysLinuxFiles/{file.Name}"), file.FullName); } }
public MainViewModel() { var tempFolder = new DirectoryInfo(Path.Combine(Path.GetTempPath(), "5E6C58AD-D485-4904-8193-BC26FE41BB11")); tempFolder.Create(); var filename = Path.Combine(tempFolder.FullName, "7z.dll"); WpfUtilities.WriteResourceToFile(new Uri("pack://application:,,,/Resources/Utilities/7z.dll"), Path.Combine(tempFolder.FullName, filename)); SevenZipExtractor.SetLibraryPath(filename); UsbStickSettings = new UsbStickSettings(); _views = new List <View> { new SelectDriveViewModel(UsbStickSettings), new SystemsViewModel(UsbStickSettings), new ModifyAppearanceViewModel(UsbStickSettings), new ApplicationsViewModel(UsbStickSettings) }; CurrentView = _views[0]; _views.ForEach(view => view.GoForwardChanged += (sender, args) => RefreshCanGoForward()); RefreshCanGoForward(); Application.Current.Exit += (sender, args) => { _views.ForEach(x => x.Dispose()); try { tempFolder.Delete(true); } catch (Exception) { // ignored } }; }
public void CreateBootStick(Logger logger) { var tempDirectory = FileSystemExtensions.MakeDirectoryUnique(Path.Combine(Path.GetTempPath(), "GodlikeStick")); logger.Status("Create temp directory"); tempDirectory.Create(); try { var targetDirectory = new DirectoryInfo(Path.Combine(_drive.RootDirectory.FullName, DriveDirectory)); if (!targetDirectory.Exists) { logger.Status($"Create /{DriveDirectory} directory on drive"); targetDirectory.Create(); } if (!File.Exists(Path.Combine(targetDirectory.FullName, "libcom32.c32"))) { InstallSysLinux(_drive, tempDirectory, logger); } logger.Status("Write syslinux config"); var sysLinuxFile = new FileInfo(Path.Combine(targetDirectory.FullName, "syslinux.cfg")); if (sysLinuxFile.Exists) { SysLinuxConfigFile = SysLinuxConfigFile.OpenFile(sysLinuxFile.FullName, _sysLinuxAppearance); } else { SysLinuxConfigFile = SysLinuxConfigFile.Create(sysLinuxFile.FullName, _sysLinuxAppearance); } logger.Status("Copy background.png"); var backgroundFilePath = Path.Combine(targetDirectory.FullName, "background.png"); if (!string.IsNullOrEmpty(_sysLinuxAppearance.ScreenBackground) && File.Exists(_sysLinuxAppearance.ScreenBackground)) { File.Copy(_sysLinuxAppearance.ScreenBackground, backgroundFilePath); } else if (!File.Exists(backgroundFilePath)) { //only copy if the file does not exist because the user could have already installed syslinux with a different background image WpfUtilities.WriteResourceToFile( new Uri("pack://application:,,,/Resources/SysLinuxFiles/background.png"), backgroundFilePath); } var randomFiles = new[] { "chain.c32", "libcom32.c32", "libutil.c32", "memdisk", "menu.c32", "vesamenu.c32", "grub.exe" }; foreach (var randomFile in randomFiles) { var resource = Application.GetResourceStream( new Uri($"pack://application:,,,/Resources/SysLinuxFiles/{randomFile}")); if (resource == null) { throw new FileNotFoundException(); } var targetFile = Path.Combine(targetDirectory.FullName, randomFile); if (File.Exists(targetFile)) { byte[] resourceHash; byte[] fileHash; using (var md5 = new MD5CryptoServiceProvider()) { resourceHash = md5.ComputeHash(resource.Stream); using (var fs = new FileStream(targetFile, FileMode.Open, FileAccess.Read)) fileHash = md5.ComputeHash(fs); } if (resourceHash.SequenceEqual(fileHash)) { logger.Status($"{randomFile} already exists"); continue; } } logger.Status($"Write \"{Path.Combine(targetDirectory.FullName, randomFile)}\""); WpfUtilities.WriteResourceToFile( new Uri($"pack://application:,,,/Resources/SysLinuxFiles/{randomFile}"), Path.Combine(targetDirectory.FullName, randomFile)); } } finally { logger.Status("Delete temp directory"); tempDirectory.Delete(true); } }