private static Win32Program ExeProgram(string path) { try { var program = CreateWin32Program(path); var info = FileVersionInfoWrapper.GetVersionInfo(path); if (!string.IsNullOrEmpty(info?.FileDescription)) { program.Description = info.FileDescription; } return(program); } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load the program from {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } catch (FileNotFoundException e) { ProgramLogger.Warn($"|Unable to locate exe file at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method ExeProgram at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } }
private static Win32Program LnkProgram(string path) { try { var program = CreateWin32Program(path); string target = ShellLinkHelper.RetrieveTargetPath(path); if (!string.IsNullOrEmpty(target)) { if (!(File.Exists(target) || Directory.Exists(target))) { // If the link points nowhere, consider it invalid. return(InvalidProgram); } program.LnkResolvedPath = program.FullPath; program.LnkResolvedExecutableName = Path.GetFileName(target); // Using CurrentCulture since this is user facing program.FullPath = Path.GetFullPath(target).ToLowerInvariant(); program.Arguments = ShellLinkHelper.Arguments; // A .lnk could be a (Chrome) PWA, set correct AppType program.AppType = program.IsWebApplication() ? ApplicationType.WebApplication : GetAppTypeFromPath(target); var description = ShellLinkHelper.Description; if (!string.IsNullOrEmpty(description)) { program.Description = description; } else { var info = FileVersionInfoWrapper.GetVersionInfo(target); if (!string.IsNullOrEmpty(info?.FileDescription)) { program.Description = info.FileDescription; } } } return(program); } catch (System.IO.FileLoadException e) { ProgramLogger.Warn($"Couldn't load the link file at {path}. This might be caused by a new link being created and locked by the OS.", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } // Only do a catch all in production. This is so make developer aware of any unhandled exception and add the exception handling in. // Error caused likely due to trying to get the description of the program catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method LnkProgram at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } }
private static Win32Program CreateWin32Program(string path) { try { return(new Win32Program { Name = Path.GetFileNameWithoutExtension(path), ExecutableName = Path.GetFileName(path), IcoPath = path, // Using InvariantCulture since this is user facing FullPath = path.ToLowerInvariant(), UniqueIdentifier = path, ParentDirectory = Directory.GetParent(path).FullName, Description = string.Empty, Valid = true, Enabled = true, AppType = ApplicationType.Win32Application, }); } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load the program from {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method CreateWin32Program at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } }
private static Win32Program InternetShortcutProgram(string path) { try { // We don't want to read the whole file if we don't need to var lines = FileWrapper.ReadLines(path); string iconPath = string.Empty; string urlPath = string.Empty; bool validApp = false; const string urlPrefix = "URL="; const string iconFilePrefix = "IconFile="; foreach (string line in lines) { // Using OrdinalIgnoreCase since this is used internally if (line.StartsWith(urlPrefix, StringComparison.OrdinalIgnoreCase)) { urlPath = line.Substring(urlPrefix.Length); if (!Uri.TryCreate(urlPath, UriKind.RelativeOrAbsolute, out Uri _)) { ProgramLogger.Warn("url could not be parsed", null, MethodBase.GetCurrentMethod().DeclaringType, urlPath); return(InvalidProgram); } // To filter out only those steam shortcuts which have 'run' or 'rungameid' as the hostname if (InternetShortcutURLPrefixes.Match(urlPath).Success) { validApp = true; } } else if (line.StartsWith(iconFilePrefix, StringComparison.OrdinalIgnoreCase)) { iconPath = line.Substring(iconFilePrefix.Length); } // If we resolved an urlPath & and an iconPath quit reading the file if (!string.IsNullOrEmpty(urlPath) && !string.IsNullOrEmpty(iconPath)) { break; } } if (!validApp) { return(InvalidProgram); } try { return(new Win32Program { Name = Path.GetFileNameWithoutExtension(path), ExecutableName = Path.GetFileName(path), IcoPath = iconPath, FullPath = urlPath.ToLowerInvariant(), UniqueIdentifier = path, ParentDirectory = Directory.GetParent(path).FullName, Valid = true, Enabled = true, AppType = ApplicationType.InternetShortcutApplication, }); } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load the program from {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method InternetShortcutProgram at {path}", e, MethodBase.GetCurrentMethod().DeclaringType, path); return(InvalidProgram); } }
private static IEnumerable <string> ProgramPaths(string directory, IList <string> suffixes, bool recursiveSearch = true) { if (!Directory.Exists(directory)) { return(Array.Empty <string>()); } var files = new List <string>(); var folderQueue = new Queue <string>(); folderQueue.Enqueue(directory); do { var currentDirectory = folderQueue.Dequeue(); try { foreach (var suffix in suffixes) { try { files.AddRange(Directory.EnumerateFiles(currentDirectory, $"*.{suffix}", SearchOption.TopDirectoryOnly)); } catch (DirectoryNotFoundException e) { ProgramLogger.Warn("|The directory trying to load the program from does not exist", e, MethodBase.GetCurrentMethod().DeclaringType, currentDirectory); } } } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load programs from {currentDirectory}", e, MethodBase.GetCurrentMethod().DeclaringType, currentDirectory); } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method ProgramPaths at {currentDirectory}", e, MethodBase.GetCurrentMethod().DeclaringType, currentDirectory); } try { // If the search is set to be non-recursive, then do not enqueue the child directories. if (!recursiveSearch) { continue; } foreach (var childDirectory in Directory.EnumerateDirectories(currentDirectory, "*", SearchOption.TopDirectoryOnly)) { folderQueue.Enqueue(childDirectory); } } catch (Exception e) when(e is SecurityException || e is UnauthorizedAccessException) { ProgramLogger.Warn($"|Permission denied when trying to load programs from {currentDirectory}", e, MethodBase.GetCurrentMethod().DeclaringType, currentDirectory); } catch (Exception e) { ProgramLogger.Exception($"|An unexpected error occurred in the calling method ProgramPaths at {currentDirectory}", e, MethodBase.GetCurrentMethod().DeclaringType, currentDirectory); } }while (folderQueue.Count > 0); return(files); }