/// <summary> /// Updates the application. /// </summary> /// <param name="dsd">The DSD.</param> private static void UpdateApplication(LicensingDetails dsd) { string folder; string localfile; //we need the exe file for later execution var exefile = ""; string exefolder; try { //0: reset current directory in case it was changed Directory.SetCurrentDirectory(Application.StartupPath); //1: Get the online files folder = _sd.AppName + "v" + DateTime.Now.Ticks; Directory.CreateDirectory(folder); } catch (Exception ex) { MessageBox.Show("Error while creating the temporary folder\n:" + ex); return; } try { var client = new WebClient(); localfile = dsd.FileLocation.Substring(dsd.FileLocation.LastIndexOf('/') + 1); client.DownloadFile(dsd.FileLocation, localfile); } catch (Exception ex) { MessageBox.Show("Error while downloading new files\n:" + ex); return; } try { var myname = AppDomain.CurrentDomain.FriendlyName; const string vshost = ".vshost."; //remove .vshost for testing if (myname.Contains(vshost)) { myname = myname.Replace(vshost, "."); } //2.1 unpack ZipExtras.ExtractZipFile(localfile, folder); //2.2 find exe foreach (var f in DirectoryExtras.GetFilesRecursive(folder)) { if (f.Contains(".exe")) { exefile = f; } if (f.EndsWith(myname)) { break; } } const string br = "\\"; exefolder = ""; //ignore everything above this dir while (exefile.Length > 0) { var c = StringExtras.ContainsSubStringCount(exefile, br); if (c > 0) { var s = exefile.Substring(0, exefile.IndexOf(br, StringComparison.Ordinal)); exefolder += s + br; exefile = exefile.Substring(exefile.IndexOf(br, StringComparison.Ordinal) + 1); } else { break; } } } catch (Exception ex) { MessageBox.Show("Error while unzipping new files\n:" + ex); return; } //move folder/* to the local dir //delete the zip file //delete folder remnants //start the exefile we found before var operations = "move /Y \"" + exefolder + "\"\\* . " + "& del /Q \"" + localfile + "\" " + "& rmdir /Q /S \"" + folder + "\" " + "& start \"\" \"" + exefile + "\" "; RunCommands(operations); //4: Kill process Application.Exit(); }
/// <summary> /// perform the merging of a vanilla df zip file, a mod zip file, an output dir, and whether to merge save and init dirs /// </summary> /// <param name="vanilla">vanilla df zip file</param> /// <param name="mod">mod df zip file</param> /// <param name="realoutput">output dir</param> /// <param name="mergesave">whether to persist save dir from orig output dir</param> /// <param name="mergeinit">whether to persist init dir from orig output dir</param> /// <param name="sf">a delegate to change status text</param> public static bool MergeOp(String vanilla, String mod, String realoutput, bool mergesave, bool mergeinit, ChangeStatusTextDel sf = null) { string vantemp = Directory.GetCurrentDirectory() + "\\vanillatemp"; string modtemp = Directory.GetCurrentDirectory() + "\\modtemp"; const string raw = "\\raw"; const string art = "\\data\\art"; const string init = "\\data\\init\\init.txt"; const string initd = "\\data\\init\\d_init.txt"; const string datainot = "\\data\\init"; const string dsave = "\\data\\save"; string outputtemp = Directory.GetCurrentDirectory() + "\\df"; string outputtempsave = outputtemp + dsave; string outputtempinit = outputtemp + datainot; string outputinit = outputtemp + init; string outputdinit = outputtemp + initd; string realsavedir = realoutput + dsave; string realsaveinit = realoutput + datainot; string modinit = modtemp + init; string moddinit = modtemp + init; //delete temps if already exist FileExtras.DeleteDirectory(vantemp); FileExtras.DeleteDirectory(modtemp); FileExtras.DeleteDirectory(outputtemp); ChangeStatusText(sf, Resources.start_exct_van_zip); try { //unpack vanilla ZipExtras.ExtractZipFile(vanilla, vantemp); ChangeStatusText(sf, Resources.fin_exct_van_zip); } catch (Exception ex) { MessageBox.Show(Resources.error_van_zip + ex); return(false); } try { //unpack mod ZipExtras.ExtractZipFile(mod, modtemp); ChangeStatusText(sf, Resources.fin_exct_mod_zip); } catch (Exception ex) { MessageBox.Show(Resources.error_mod_zip + ex); return(false); } try { //move vanilla FileExtras.MergeDirectories(outputtemp, vantemp); //delete raw and art FileExtras.DeleteDirectory(outputtemp + raw); FileExtras.DeleteDirectory(outputtemp + art); //move mod raw and art FileExtras.MergeDirectories(outputtemp + raw, modtemp + raw); FileExtras.MergeDirectories(outputtemp + art, modtemp + art); //copy init/init.d if (File.Exists(modinit)) { File.Copy(modinit, outputinit, true); } if (File.Exists(moddinit)) { File.Copy(moddinit, outputdinit, true); } ChangeStatusText(sf, Resources.fin_merge); //get save games if required if (mergesave && Directory.Exists(realsavedir)) { FileExtras.CreateDirectory(outputtempsave); FileExtras.MergeDirectories(outputtempsave, realsavedir); } //get init dir if required if (mergeinit && Directory.Exists(realsaveinit)) { FileExtras.MergeDirectories(outputtempinit, realsaveinit); } //delete temps FileExtras.DeleteDirectory(vantemp); FileExtras.DeleteDirectory(modtemp); //move temp to real FileExtras.DeleteDirectory(realoutput); FileExtras.MergeDirectories(realoutput, outputtemp); FileExtras.DeleteDirectory(outputtemp); ChangeStatusText(sf, Resources.ready); } catch (Exception ex) { MessageBox.Show("An error occured:" + ex); return(false); } return(true); }