public void UpdateAppList() { try { SteamAppsFolder.Refresh(); if (!SteamAppsFolder.Exists) { SteamAppsFolder.Create(); SteamAppsFolder.Refresh(); if (!SteamAppsFolder.Exists) { MessageBox.Show("Can not create steam apps folder at: " + SteamAppsFolder.FullName + "\n\nIf you believe this path exists and SLM can't do it's job, please contact with me."); return; } } if (Apps.Count > 0) { Apps.Clear(); } // Foreach *.acf file found in library Parallel.ForEach(SteamAppsFolder.EnumerateFiles("appmanifest_*.acf", SearchOption.TopDirectoryOnly).ToList(), AcfFile => { // Define a new value and call KeyValue Framework.KeyValue KeyValReader = new Framework.KeyValue(); // Read the *.acf file as text KeyValReader.ReadFileAsText(AcfFile.FullName); // If key doesn't contains a child (value in acf file) if (KeyValReader.Children.Count == 0) { List.LCItems.Add(new List.JunkInfo { FSInfo = new FileInfo(AcfFile.FullName), Size = AcfFile.Length, Library = Library }); return; } Functions.App.AddSteamApp(Convert.ToInt32(KeyValReader["appID"].Value), KeyValReader["name"].Value ?? KeyValReader["UserConfig"]["name"].Value, KeyValReader["installdir"].Value, Library, Convert.ToInt64(KeyValReader["SizeOnDisk"].Value), Convert.ToInt64(KeyValReader["LastUpdated"].Value), false); }); // Do a loop for each *.zip file in library Parallel.ForEach(Directory.EnumerateFiles(SteamAppsFolder.FullName, "*.zip", SearchOption.TopDirectoryOnly).ToList(), ArchiveFile => Functions.App.ReadDetailsFromZip(ArchiveFile, Library)); SteamBackupsFolder.Refresh(); if (Library.Type == Enums.LibraryType.SLM && SteamBackupsFolder.Exists) { foreach (FileInfo SkuFile in SteamBackupsFolder.EnumerateFiles("*.sis", SearchOption.AllDirectories).ToList()) { Framework.KeyValue KeyValReader = new Framework.KeyValue(); KeyValReader.ReadFileAsText(SkuFile.FullName); string[] AppNames = System.Text.RegularExpressions.Regex.Split(KeyValReader["name"].Value, " and "); int i = 0; long AppSize = Functions.FileSystem.GetDirectorySize(SkuFile.Directory, true); foreach (Framework.KeyValue App in KeyValReader["apps"].Children) { if (Apps.Count(x => x.AppID == Convert.ToInt32(App.Value) && x.IsSteamBackup) > 0) { continue; } Functions.App.AddSteamApp(Convert.ToInt32(App.Value), AppNames[i], SkuFile.DirectoryName, Library, AppSize, SkuFile.LastWriteTimeUtc.ToUnixTimestamp(), false, true); if (AppNames.Length > 1) { i++; } } } } if (SLM.CurrentSelectedLibrary != null) { if (SLM.CurrentSelectedLibrary == Library) { Functions.App.UpdateAppPanel(Library); } } } catch (UnauthorizedAccessException uaex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { await Main.FormAccessor.ShowMessageAsync("UnauthorizedAccessException!", $"[{FullPath}] An error releated to folder permissions happened during generating library content. Running SLM as Administrator might help.\n\nError: {uaex.Message}"); }, System.Windows.Threading.DispatcherPriority.Normal); } catch (DirectoryNotFoundException dnfex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { await Main.FormAccessor.ShowMessageAsync("UnauthorizedAccessException!", $"[{FullPath}] Folder couldn't be created/not found. Running SLM as Administrator might help.\n\nIf you believe this path exists and SLM can't do it's job, please contact with me.\n\nError: {dnfex.Message}"); }, System.Windows.Threading.DispatcherPriority.Normal); } catch (Exception ex) { MessageBox.Show(ex.ToString()); logger.Fatal(ex); SLM.RavenClient.Capture(new SharpRaven.Data.SentryEvent(ex)); } }
public void UpdateAppList() { try { SteamAppsFolder.Refresh(); if (!SteamAppsFolder.Exists) { SteamAppsFolder.Create(); SteamAppsFolder.Refresh(); if (!SteamAppsFolder.Exists) { MessageBox.Show(Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.SteamLibrary_CantCreate)), new { SteamAppsFolderFullPath = SteamAppsFolder.FullName })); return; } } if (Apps.Count > 0) { Apps.Clear(); } // Foreach *.acf file found in library foreach (FileInfo AcfFile in SteamAppsFolder.EnumerateFiles("appmanifest_*.acf", SearchOption.TopDirectoryOnly).ToList()) { // Define a new value and call KeyValue Framework.KeyValue KeyValReader = new Framework.KeyValue(); // Read the *.acf file as text KeyValReader.ReadFileAsText(AcfFile.FullName); // If key doesn't contains a child (value in acf file) if (KeyValReader.Children.Count == 0) { List.LCProgress.Report(new List.JunkInfo { FSInfo = new FileInfo(AcfFile.FullName), Size = AcfFile.Length, Library = Library }); continue; } Functions.App.AddSteamApp(Convert.ToInt32(KeyValReader["appID"].Value), KeyValReader["name"].Value ?? KeyValReader["UserConfig"]["name"].Value, KeyValReader["installdir"].Value, Library, Convert.ToInt64(KeyValReader["SizeOnDisk"].Value), Convert.ToInt64(KeyValReader["LastUpdated"].Value), false); } // Do a loop for each *.zip file in library Parallel.ForEach(Directory.EnumerateFiles(SteamAppsFolder.FullName, "*.zip", SearchOption.TopDirectoryOnly).ToList(), ArchiveFile => Functions.App.ReadDetailsFromZip(ArchiveFile, Library)); SteamBackupsFolder.Refresh(); if (Library.Type == Enums.LibraryType.SLM && SteamBackupsFolder.Exists) { foreach (FileInfo SkuFile in SteamBackupsFolder.EnumerateFiles("*.sis", SearchOption.AllDirectories).ToList()) { Framework.KeyValue KeyValReader = new Framework.KeyValue(); KeyValReader.ReadFileAsText(SkuFile.FullName); string[] AppNames = System.Text.RegularExpressions.Regex.Split(KeyValReader["name"].Value, " and "); int i = 0; long AppSize = Functions.FileSystem.GetDirectorySize(SkuFile.Directory, true); foreach (Framework.KeyValue App in KeyValReader["apps"].Children) { if (Apps.Count(x => x.AppID == Convert.ToInt32(App.Value) && x.IsSteamBackup) > 0) { continue; } Functions.App.AddSteamApp(Convert.ToInt32(App.Value), AppNames[i], SkuFile.DirectoryName, Library, AppSize, SkuFile.LastWriteTimeUtc.ToUnixTimestamp(), false, true); if (AppNames.Length > 1) { i++; } } } } if (SLM.CurrentSelectedLibrary != null && SLM.CurrentSelectedLibrary == Library) { Functions.App.UpdateAppPanel(Library); } } catch (UnauthorizedAccessException uaex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.UnauthorizedAccessException)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.UnauthorizedAccessExceptionMessage)), new { FullPath, ExceptionMessage = uaex.Message })); }, System.Windows.Threading.DispatcherPriority.Normal); } catch (DirectoryNotFoundException dnfex) { Main.FormAccessor.AppView.AppPanel.Dispatcher.Invoke(async delegate { await Main.FormAccessor.ShowMessageAsync(Functions.SLM.Translate(nameof(Properties.Resources.DirectoryNotFoundException)), Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.DirectoryNotFoundExceptionMessage)), new { FolderfullPath = FullPath, ExceptionMessage = dnfex.Message })); }, System.Windows.Threading.DispatcherPriority.Normal); } catch (Exception ex) { MessageBox.Show(ex.ToString()); logger.Fatal(ex); } }