/// <summary>Updates the file on the system.</summary> /// <param name="file">The file to install or update.</param> static void UpdateFile(UpdateFile file) { switch (file.Action) { case FileAction.ExecuteThenDelete: case FileAction.UnregisterThenDelete: case FileAction.Delete: if (file.Action == FileAction.ExecuteThenDelete) { if (File.Exists(file.Source)) { Utilities.StartProcess(file.Source, file.Args, true); } } if (file.Action == FileAction.UnregisterThenDelete) { Utilities.StartProcess("regsvr32", "/u /s" + file.Destination); } try { File.Delete(file.Destination); } catch (IOException) { NativeMethods.MoveFileExW(file.Destination, null, MoveOnReboot); } break; case FileAction.Execute: try { Utilities.StartProcess(file.Destination, file.Args); } catch (FileNotFoundException e) { Utilities.ReportError(e, ErrorType.InstallationError); errorOccurred = true; } break; case FileAction.Update: case FileAction.UpdateIfExist: case FileAction.UpdateThenExecute: case FileAction.UpdateThenRegister: if (File.Exists(file.Source)) { try { if (File.Exists(file.Destination + @".bak")) { File.Delete(file.Destination + @".bak"); } if (File.Exists(file.Destination)) { File.Move(file.Destination, file.Destination + @".bak"); } File.Move(file.Source, file.Destination); if (File.Exists(file.Destination + @".bak")) { try { File.Delete(file.Destination + @".bak"); } catch (Exception e) { if (!(e is UnauthorizedAccessException || e is IOException)) { Utilities.ReportError(e, ErrorType.InstallationError); throw; } Utilities.RebootNeeded = true; NativeMethods.MoveFileExW(file.Source, file.Destination, MoveOnReboot); NativeMethods.MoveFileExW(file.Source, file.Destination + ".bak", MoveOnReboot); } } } catch (Exception e) { if (!(e is UnauthorizedAccessException || e is IOException)) { Utilities.ReportError(e, ErrorType.InstallationError); throw; } Utilities.RebootNeeded = true; NativeMethods.MoveFileExW(file.Source, file.Destination, MoveOnReboot); NativeMethods.MoveFileExW(file.Source, file.Destination + ".bak", MoveOnReboot); } } else { Utilities.ReportError(new FileNotFoundException(file.Source), ErrorType.InstallationError); errorOccurred = true; } if (file.Action == FileAction.UpdateThenExecute) { try { Utilities.StartProcess(file.Destination, file.Args); } catch (FileNotFoundException e) { Utilities.ReportError(e, ErrorType.InstallationError); errorOccurred = true; } } if (file.Action == FileAction.UpdateThenRegister) { Utilities.StartProcess(@"regsvr32", @"/s" + file.Destination); } break; } }