public List <string> GetMatchingFiles() { var path = Path.Combine( Environment.GetEnvironmentVariable("AppData"), "Microsoft", "Windows", "Recent" ); List <string> result = new List <string>(); var files = Directory.EnumerateFiles(path, "*.lnk"); foreach (var file in files) { // Typically happens with pendrives. Maybe we should treat this as a "Yes, please filter"? // Have a separate option to always delete no if (!File.Exists(file)) { Logger.Debug($"File {file} does not exist, skipping.."); continue; } string target; try { target = LinkUtil.GetLnkTarget(_shell, file); } catch (COMException ex) { if (LinkUtil.IsMissingDriveException(ex)) { if (_filterMissingDrives) { result.Add(file); } continue; } else { throw; } } foreach (var filter in _masks) { var doFilter = target.StartsWith(filter, StringComparison.OrdinalIgnoreCase); if (doFilter) { result.Add(file); break; } } } return(result); }
private bool ContainsPattern(CFStorage storage, string fileName) { var stream = storage.GetStream(fileName); var data = stream.GetData(); if (data.Length == 0) { Logger.Debug($"Ignoring \"{fileName}\", len: 0"); return(false); } foreach (var pattern in _masks) { try { var target = GetLnkTarget(data); if (target.ToLowerInvariant().StartsWith(pattern.ToLowerInvariant())) { Logger.Debug($"Target \"{target}\" matches pattern \"{pattern}\""); return(true); } else if (string.Empty.Equals(target)) { Logger.Debug($"Target \"{target}\" ignored, not a lnk file"); } } catch (System.Runtime.InteropServices.COMException ex) { if (LinkUtil.IsMissingDriveException(ex)) { Logger.Debug($"Target drive does not exist, marking for deletion"); return(true); } else { Logger.Debug($"Target ignored, not a lnk file"); } } /*if (ContainsSubstring(data, pattern)) { * return true; * }*/ } return(false); }