// Deletes any files extracted during the test void TestEmptyArchive(ArchiveFile archiveFile, string archiveFilename) { const string extractDirectory = "./TestExtract"; Assert.ThrowsException <Exception>(() => archiveFile.GetIndex("TestItem")); Assert.ThrowsException <ArgumentOutOfRangeException>(() => archiveFile.GetName(0)); Assert.ThrowsException <ArgumentOutOfRangeException>(() => archiveFile.GetSize(0)); Assert.IsFalse(archiveFile.Contains("TestItem")); Assert.ThrowsException <ArgumentOutOfRangeException>(() => archiveFile.OpenStream(0)); Assert.ThrowsException <ArgumentOutOfRangeException>(() => archiveFile.ExtractFile(0, "Test")); archiveFile.ExtractAllFiles(extractDirectory); Assert.AreEqual(archiveFilename, archiveFile.GetArchiveFilename()); Assert.AreEqual(0, archiveFile.GetCount()); Assert.IsTrue(0 <= archiveFile.GetArchiveFileSize()); File.Delete(extractDirectory); }
private void OnExtractFileSavePathSelected(ArchiveFile archive, string fileName, string destPath) { interactable = true; try { if (Path.GetExtension(fileName).ToLowerInvariant() == ".bmp") { // Special processing to convert tileset to a standard bmp format BitmapFile bitmapFile = TilesetLoader.ReadTileset(archive.ExtractFileToMemory(fileName)); bitmapFile.Serialize(destPath); } else { archive.ExtractFile(fileName, destPath); } } finally { archive.Dispose(); } Debug.Log(Path.GetFileName(destPath) + " extracted successfully."); }
private void Install() { string sevenZipExecutable = Path.Combine(InstallerSettings.DownloadDirectory, "7za.exe"); if (!File.Exists(sevenZipExecutable)) { // extract 7za from executable File.WriteAllBytes(sevenZipExecutable, Properties.Resources._7za); } // store the patches for later // we'll apply them when everything is installed Dictionary <string, KeyValuePair <string, string> > patchList = new Dictionary <string, KeyValuePair <string, string> >(); foreach (InstallerComponent component in InstallerComponents.Components) { // if it's disabled, // skip it if (!component.Enabled) { continue; } Log($"Installing {component.Name}..."); if (component.Patches != null) { // store patches in a dictionary, // we're gonna execute them when everything is installed foreach (KeyValuePair <string, KeyValuePair <string, string> > patch in component.Patches) { patchList.Add(patch.Key, patch.Value); } } // if it's not an archive, // just copy the files if (!component.Archive) { foreach (KeyValuePair <string, string> cFiles in component.Files) { string sourceFile = Path.Combine(InstallerSettings.DownloadDirectory, cFiles.Key); string targetFile = Path.Combine(InstallerSettings.InstallDirectory, cFiles.Value); try { File.Copy(sourceFile, targetFile, true); } catch (Exception e) { Log($"Installing {component.Name} Failed"); Log(e.Message); Log(e.StackTrace); return; } } continue; } // if it's an archive, extract each file // in the right location string archiveFile = Path.Combine(InstallerSettings.DownloadDirectory, component.Urls.First().FileName); using (ArchiveFile archive = new ArchiveFile(archiveFile, sevenZipExecutable)) { if (component.ExtractAll) { bool extractSuccess = archive.ExtractAll(InstallerSettings.InstallDirectory); if (!extractSuccess) { Log($"Installing {component.Name} Failed"); if (archive.Exception != null) { Log(archive.Exception.Message); Log(archive.Exception.StackTrace); } return; } } else { foreach (KeyValuePair <string, string> extractFileInfo in component.Files) { archive.OnProgressChange += (object source, int value) => { ChangeProgressBarValue(value); }; string targetFile = Path.Combine(InstallerSettings.InstallDirectory, extractFileInfo.Value); bool extractSuccess = archive.ExtractFile(extractFileInfo.Key, targetFile); if (extractSuccess) { continue; } Log($"Installing {component.Name} Failed"); if (archive.Exception != null) { Log(archive.Exception.Message); Log(archive.Exception.StackTrace); } return; } } } } // execute the 'patches' // these 'patches' only allow us to replace text // so just read the file, replace the text and write the file try { foreach (KeyValuePair <string, KeyValuePair <string, string> > patch in patchList) { string file = Path.Combine(InstallerSettings.InstallDirectory, patch.Key); File.WriteAllText(file, File.ReadAllText(file) .Replace(patch.Value.Key, patch.Value.Value)); } } catch (Exception e) { Log("Patching Failed"); Log(e.Message); Log(e.StackTrace); return; } Log("Completed"); // launch post-install screen LaunchCompleted(); }
private void Install() { string sevenZipExecutable = Path.Combine(InstallerSettings.DownloadDirectory, "7za.exe"); if (!File.Exists(sevenZipExecutable)) { // extract 7za from executable File.WriteAllBytes(sevenZipExecutable, Properties.Resources._7za); } // store the additions for later // we'll apply them when everything is installed var additionsList = new Dictionary <string, string[]>(); foreach (InstallerComponent component in InstallerSettings.InstallerComponents.Components) { // skip when component is disabled if (!component.Enabled) { continue; } ChangeProgressBarValue(0); Log($"Installing {component.Name}..."); // store additions for later if (component.Additions != null) { foreach (var addition in component.Additions) { if (additionsList.ContainsKey(addition.Key)) { // append to values var values = additionsList[addition.Key].ToList(); values.AddRange(addition.Value); additionsList[addition.Key] = values.ToArray(); } else { // add to dictionary additionsList.Add(addition.Key, addition.Value); } } } // if it's not an archive, // just copy the files if (!component.Archive) { foreach (KeyValuePair <string, string> cFiles in component.Files) { string sourceFile = Path.Combine(InstallerSettings.DownloadDirectory, cFiles.Key); string targetFile = Path.Combine(InstallerSettings.InstallDirectory, cFiles.Value); try { File.Copy(sourceFile, targetFile, true); } catch (Exception e) { Log($"Installing {component.Name} Failed"); Log(e.Message); Log(e.StackTrace); ComponentHelper.CleanupInstallationFiles(); return; } } continue; } // if it's an archive, extract each file // in the right location string filename = component.Urls.First().FileName == null? component.FallbackUrls.First().FileName: component.Urls.First().FileName; string archiveFile = Path.Combine(InstallerSettings.DownloadDirectory, filename); using (ArchiveFile archive = new ArchiveFile(archiveFile, sevenZipExecutable)) { if (component.ExtractAll) { bool extractSuccess = archive.ExtractAll(InstallerSettings.InstallDirectory); if (!extractSuccess) { Log($"Installing {component.Name} Failed"); if (archive.Exception != null) { Log(archive.Exception.Message); Log(archive.Exception.StackTrace); } ComponentHelper.CleanupInstallationFiles(); return; } } else { foreach (KeyValuePair <string, string> extractFileInfo in component.Files) { archive.OnProgressChange += (object source, int value) => { ChangeProgressBarValue(value); }; string targetFile = Path.Combine(InstallerSettings.InstallDirectory, extractFileInfo.Value); bool extractSuccess = archive.ExtractFile(extractFileInfo.Key, targetFile); if (!extractSuccess) { Log($"Installing {component.Name} Failed"); if (archive.Exception != null) { Log(archive.Exception.Message); Log(archive.Exception.StackTrace); } ComponentHelper.CleanupInstallationFiles(); return; } } } } } // apply additions try { foreach (var addition in additionsList) { string file = Path.Combine(InstallerSettings.InstallDirectory, addition.Key); File.AppendAllLines(file, addition.Value); } } catch (Exception e) { Log("Applying Additions Failed"); Log(e.Message); Log(e.StackTrace); ComponentHelper.CleanupInstallationFiles(); return; } Log("Completed"); // launch post-install screen LaunchCompleted(); }