From 6b05a3e8cb549316303c9acce4731008ae9e666b Mon Sep 17 00:00:00 2001 From: Ryan Kistner Date: Thu, 11 Mar 2021 23:02:02 -0700 Subject: [PATCH] When downloading files into a target directory, remove files with conflicting paths from earlier depots. Fixes #188 --- DepotDownloader/ContentDownloader.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/DepotDownloader/ContentDownloader.cs b/DepotDownloader/ContentDownloader.cs index b87fa3b8..cbf38b97 100644 --- a/DepotDownloader/ContentDownloader.cs +++ b/DepotDownloader/ContentDownloader.cs @@ -720,6 +720,21 @@ namespace DepotDownloader cts.Token.ThrowIfCancellationRequested(); } + // If we're about to write all the files to the same directory, we will need to first de-duplicate any files by path + // This is in last-depot-wins order, from Steam or the list of depots supplied by the user + if (!string.IsNullOrWhiteSpace(ContentDownloader.Config.InstallDirectory) && depotsToDownload.Count > 0) + { + var claimedFileNames = new HashSet(); + + for (var i = depotsToDownload.Count - 1; i >= 0; i--) + { + // For each depot, remove all files from the list that have been claimed by a later depot + depotsToDownload[i].filteredFiles.RemoveAll(file => claimedFileNames.Contains(file.FileName)); + + claimedFileNames.UnionWith(depotsToDownload[i].allFileNames); + } + } + foreach (var depotFileData in depotsToDownload) { await DownloadSteam3AsyncDepotFiles(cts, appId, downloadCounter, depotFileData, allFileNamesAllDepots);