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);
        }
示例#2
0
        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);
        }