static int Main(string[] args)
        {
            var steamClient    = new SteamClientUtils();
            var steamLibraries = steamClient.GetLibraries();

            Console.WriteLine($"Steam path: {steamClient.SteamPath}");
            Console.WriteLine();

            if (args.Length == 0 || !uint.TryParse(args[0], out var appid))
            {
                foreach (var library in steamLibraries)
                {
                    var manifests = Directory.GetFiles(library, "appmanifest_*.acf");

                    foreach (var appManifestPath in manifests)
                    {
                        VerifyApp(steamClient, appManifestPath);

                        Console.WriteLine();
                        Console.WriteLine("------------------------------");
                        Console.WriteLine();
                    }
                }
            }
            else
            {
                Console.WriteLine($"AppID: {appid}");

                var appManifestPath = steamLibraries
                                      .Select(library => Path.Join(library, $"appmanifest_{appid}.acf"))
                                      .FirstOrDefault(File.Exists);

                if (appManifestPath == null)
                {
                    throw new FileNotFoundException("Unable to find appmanifest anywhere.");
                }

                VerifyApp(steamClient, appManifestPath);
            }

            Console.WriteLine();
            Console.WriteLine("If some files are listed as unknown but shouldn't be, they are probably from the SDK.");
            Console.WriteLine("After deleting files, verify the game files in Steam.");

            return(0);
        }
Exemple #2
0
        static int Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine();
            Console.WriteLine("[>] Follow https://twitter.com/thexpaw :)");
            Console.WriteLine();
            Console.ResetColor();

            var steamClient    = new SteamClientUtils();
            var steamLibraries = steamClient.GetLibraries();

            Console.WriteLine($"Steam path: {steamClient.SteamPath}");
            Console.WriteLine();

            if ((args.Length > 0 && uint.TryParse(args[0], out var appid)))
            {
                var deleteUnknownFiles = args.Length == 2 && args[1] == DELETE_FLAG;

                Console.WriteLine($"AppID: {appid}");

                var appManifestPath = steamLibraries
                                      .Select(library => Path.Join(library, $"appmanifest_{appid}.acf"))
                                      .FirstOrDefault(File.Exists);

                if (appManifestPath == null)
                {
                    throw new FileNotFoundException("Unable to find appmanifest anywhere.");
                }

                VerifyApp(steamClient, appManifestPath, deleteUnknownFiles);

                Console.WriteLine();
                Console.WriteLine("If some files are listed as unknown but shouldn't be, they are probably from the SDK.");
                Console.WriteLine("After deleting files, verify the game files in Steam.");

                return(0);
            }

            Console.WriteLine("Usage: {appID} [d]");
            return(-1);
        }
Exemple #3
0
        private static void VerifyApp(SteamClientUtils steamClient, string appManifestPath, bool deleteUnknownFiles)
        {
            Console.WriteLine($"Parsing {appManifestPath}");

            var kv            = KeyValue.LoadAsText(appManifestPath);
            var mountedDepots = kv["MountedDepots"];
            var gamePath      = Path.Join(Path.GetDirectoryName(appManifestPath), "common", kv["installdir"].Value);

            if (!Directory.Exists(gamePath))
            {
                throw new DirectoryNotFoundException($"Game not found: {gamePath}");
            }

            Console.WriteLine($"Scanning {gamePath}");

            var allKnownDepotFiles = new Dictionary <string, ulong>();

            foreach (var mountedDepot in mountedDepots.Children)
            {
                var manifestPath = Path.Join(steamClient.SteamPath, "depotcache", $"{mountedDepot.Name}_{mountedDepot.Value}.manifest");

                if (!File.Exists(manifestPath))
                {
                    Console.Error.WriteLine($"Manifest does not exist: {manifestPath}");
                    continue;
                }

                var manifest = DepotManifest.Deserialize(File.ReadAllBytes(manifestPath));

                foreach (var file in manifest.Files)
                {
                    if (file.Flags.HasFlag(EDepotFileFlag.Directory))
                    {
                        continue;
                    }

                    allKnownDepotFiles[file.FileName] = file.TotalSize;
                }

                Console.WriteLine($"{manifestPath} - {manifest.Files.Count} files");
            }

            Console.WriteLine($"{allKnownDepotFiles.Count} files in depot manifests");

            var filesOnDisk = Directory.GetFiles(gamePath, "*", SearchOption.AllDirectories).ToList();

            filesOnDisk.Sort();

            Console.WriteLine($"{filesOnDisk.Count} files on disk");
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;

            var filenamesOnDisk = new HashSet <string>();

            foreach (var file in filesOnDisk)
            {
                var unprefixedPath = file.Substring(gamePath.Length + 1);

                filenamesOnDisk.Add(unprefixedPath);

                if (unprefixedPath == "installscript.vdf")
                {
                    continue;
                }

                if (!allKnownDepotFiles.ContainsKey(unprefixedPath))
                {
                    Console.Write($"Unknown file: {unprefixedPath}");

                    if (deleteUnknownFiles && !InsideWhitelist(file))
                    {
                        try
                        {
                            File.Delete(file);
                            Console.Write(" -> [Deleted]");
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Unable to delete!");
                            Console.WriteLine(ex);
                        }
                    }

                    Console.WriteLine();

                    continue;
                }

                var length = new FileInfo(file).Length;

                if (allKnownDepotFiles[unprefixedPath] != (ulong)length)
                {
                    Console.WriteLine($"Mismatching file size: {unprefixedPath} (is {length} bytes, should be {allKnownDepotFiles[unprefixedPath]})");
                    continue;
                }
            }

            foreach (var file in allKnownDepotFiles.Keys.Where(file => !filenamesOnDisk.Contains(file)))
            {
                Console.WriteLine($"Missing file: {file}");
            }

            Console.ResetColor();
        }