From f39015ff6a72743cbff891b37af9d336cd1eaac4 Mon Sep 17 00:00:00 2001 From: Daniel Brunner <0xFEEDC0DE64@gmail.com> Date: Sat, 4 Feb 2017 18:47:33 +0100 Subject: [PATCH] Implemented list of all games --- SteamMover/Form1.Designer.cs | 64 +++++++++++++++++++++++++++++++++++- SteamMover/Form1.cs | 32 ++++++++++++++---- SteamMover/Game.cs | 12 +++++++ SteamMover/SteamMover.csproj | 1 + 4 files changed, 101 insertions(+), 8 deletions(-) create mode 100644 SteamMover/Game.cs diff --git a/SteamMover/Form1.Designer.cs b/SteamMover/Form1.Designer.cs index 1f5a6f6..24da3af 100644 --- a/SteamMover/Form1.Designer.cs +++ b/SteamMover/Form1.Designer.cs @@ -28,12 +28,74 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + this.objectListView1 = new BrightIdeasSoftware.ObjectListView(); + this.columnId = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.columnName = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.columnDirectory = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + this.columnLibrary = ((BrightIdeasSoftware.OLVColumn)(new BrightIdeasSoftware.OLVColumn())); + ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).BeginInit(); + this.SuspendLayout(); + // + // objectListView1 + // + this.objectListView1.AllColumns.Add(this.columnId); + this.objectListView1.AllColumns.Add(this.columnName); + this.objectListView1.AllColumns.Add(this.columnDirectory); + this.objectListView1.AllColumns.Add(this.columnLibrary); + this.objectListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnId, + this.columnName, + this.columnDirectory}); + this.objectListView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.objectListView1.Location = new System.Drawing.Point(0, 0); + this.objectListView1.Name = "objectListView1"; + this.objectListView1.Size = new System.Drawing.Size(968, 590); + this.objectListView1.TabIndex = 0; + this.objectListView1.UseCompatibleStateImageBehavior = false; + this.objectListView1.View = System.Windows.Forms.View.Details; + // + // columnId + // + this.columnId.AspectName = "id"; + this.columnId.Text = "ID"; + // + // columnName + // + this.columnName.AspectName = "name"; + this.columnName.Text = "Name"; + // + // columnDirectory + // + this.columnDirectory.AspectName = "directory"; + this.columnDirectory.Text = "Directory"; + // + // columnLibrary + // + this.columnLibrary.AspectName = "library"; + this.columnLibrary.DisplayIndex = 3; + this.columnLibrary.IsVisible = false; + this.columnLibrary.Text = "Library"; + // + // Form1 + // + this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(968, 590); + this.Controls.Add(this.objectListView1); + this.Name = "Form1"; this.Text = "Form1"; + ((System.ComponentModel.ISupportInitialize)(this.objectListView1)).EndInit(); + this.ResumeLayout(false); + } #endregion + + private BrightIdeasSoftware.ObjectListView objectListView1; + private BrightIdeasSoftware.OLVColumn columnId; + private BrightIdeasSoftware.OLVColumn columnName; + private BrightIdeasSoftware.OLVColumn columnDirectory; + private BrightIdeasSoftware.OLVColumn columnLibrary; } } diff --git a/SteamMover/Form1.cs b/SteamMover/Form1.cs index d87159c..e45ade2 100644 --- a/SteamMover/Form1.cs +++ b/SteamMover/Form1.cs @@ -19,16 +19,34 @@ namespace SteamMover private static readonly Regex regexObjectEnd = new Regex("^(?: |\t)*\\}$"); private static readonly Regex regexVariable = new Regex("^(?: |\t)*\"([^\"]*)\"(?: |\t)*\"([^\"]*)\"$"); + private const string defaultDir = @"C:\Program Files (x86)\Steam\steamapps"; + public Form1() { InitializeComponent(); - foreach (var path in Directory.GetFiles(@"C:\Program Files (x86)\Steam\steamapps\", "*.acf", SearchOption.AllDirectories)) - ReadConfigObject(File.OpenText(path)); - foreach (var path in Directory.GetFiles(@"D:\SteamLibrary\steamapps", "*.acf", SearchOption.AllDirectories)) - ReadConfigObject(File.OpenText(path)); - foreach (var path in Directory.GetFiles(@"F:\SteamLibrary\steamapps", "*.acf", SearchOption.AllDirectories)) - ReadConfigObject(File.OpenText(path)); + var libraries = new List { defaultDir }; + var libraryConf = (Dictionary)ReadConfigObject(File.OpenText(Path.Combine(defaultDir, "libraryfolders.vdf")))["LibraryFolders"]; + for (var i = 1; libraryConf.ContainsKey(i.ToString()); i++) + libraries.Add(Path.Combine((string)libraryConf[i.ToString()], "steamapps")); + + var games = new List(); + foreach(var library in libraries) + foreach(var appmanifestPath in Directory.GetFiles(library, "appmanifest_*.acf", SearchOption.TopDirectoryOnly)) + { + var appmanifestConf = (Dictionary)ReadConfigObject(File.OpenText(appmanifestPath))["AppState"]; + + games.Add(new Game + { + id = Convert.ToInt32((string)appmanifestConf["appid"]), + name = (string)appmanifestConf["name"], + library = library, + directory = (string)appmanifestConf["installdir"], + }); + } + + objectListView1.AlwaysGroupByColumn = columnLibrary; + objectListView1.SetObjects(games); } private Dictionary ReadConfigObject(StreamReader streamReader, bool nestedObject = false) @@ -63,7 +81,7 @@ namespace SteamMover else if ((match = regexVariable.Match(line)).Success) { var key = match.Groups[1].Value; - var value = match.Groups[2].Value; + var value = match.Groups[2].Value.Replace("\\\\", "\\"); dictionary.Add(key, value); } diff --git a/SteamMover/Game.cs b/SteamMover/Game.cs new file mode 100644 index 0000000..66e70b1 --- /dev/null +++ b/SteamMover/Game.cs @@ -0,0 +1,12 @@ +using System; + +namespace SteamMover +{ + struct Game + { + public int id; + public string name; + public string library; + public string directory; + } +} diff --git a/SteamMover/SteamMover.csproj b/SteamMover/SteamMover.csproj index f1d766a..433892a 100644 --- a/SteamMover/SteamMover.csproj +++ b/SteamMover/SteamMover.csproj @@ -52,6 +52,7 @@ Form1.cs +