// TrySetupToolsDirectory - // Copies GVFS Upgrader tool and its dependencies to a temporary location in ProgramData. // Reason why this is needed - When GVFS.Upgrader.exe is run from C:\ProgramFiles\GVFS folder // upgrade installer that is downloaded and run will fail. This is because it cannot overwrite // C:\ProgramFiles\GVFS\GVFS.Upgrader.exe that is running. Moving GVFS.Upgrader.exe along with // its dependencies to a temporary location inside ProgramData and running GVFS.Upgrader.exe // from this temporary location helps avoid this problem. public virtual bool TrySetupToolsDirectory(out string upgraderToolPath, out string error) { string rootDirectoryPath = ProductUpgraderInfo.GetUpgradesDirectoryPath(); string toolsDirectoryPath = Path.Combine(rootDirectoryPath, ToolsDirectory); Exception exception; if (TryCreateDirectory(toolsDirectoryPath, out exception)) { string currentPath = ProcessHelper.GetCurrentProcessLocation(); error = null; foreach (string name in UpgraderToolAndLibs) { string toolPath = Path.Combine(currentPath, name); string destinationPath = Path.Combine(toolsDirectoryPath, name); try { File.Copy(toolPath, destinationPath, overwrite: true); } catch (UnauthorizedAccessException e) { error = string.Join( Environment.NewLine, "File copy error - " + e.Message, $"Make sure you have write permissions to directory {rootDirectoryPath} and run {GVFSConstants.UpgradeVerbMessages.GVFSUpgradeConfirm} again."); this.TraceException(e, nameof(this.TrySetupToolsDirectory), $"Error copying {toolPath} to {destinationPath}."); break; } catch (IOException e) { error = "File copy error - " + e.Message; this.TraceException(e, nameof(this.TrySetupToolsDirectory), $"Error copying {toolPath} to {destinationPath}."); break; } } upgraderToolPath = string.IsNullOrEmpty(error) ? Path.Combine(toolsDirectoryPath, UpgraderToolName) : null; return(string.IsNullOrEmpty(error)); } upgraderToolPath = null; error = exception.Message; this.TraceException(exception, nameof(this.TrySetupToolsDirectory), $"Error creating upgrade tools directory {toolsDirectoryPath}."); return(false); }