public void ScanExes() { DriveInfo[] drives = DriveInfo.GetDrives(); Stopwatch stop = new Stopwatch(); for (int i = 0; i < drives.Length; i++) { DriveInfo d = drives[i]; if (d.DriveFormat != "NTFS") { continue; } LogManager.Log("> Searching drive {0} for game executables", d.Name); stop.Reset(); stop.Start(); Dictionary<ulong, FileNameAndParentFrn> mDict = new Dictionary<ulong, FileNameAndParentFrn>(); MFTReader mft = new MFTReader(); mft.Drive = d.RootDirectory.FullName; mft.EnumerateVolume(out mDict, new string[] { ".exe" }); foreach (KeyValuePair<UInt64, FileNameAndParentFrn> entry in mDict) { FileNameAndParentFrn file = (FileNameAndParentFrn)entry.Value; string name = file.Name; string lower = name.ToLower(); GameInfo game; if (gameManager.GameInfos.TryGetValue(lower, out game)) { string path = mft.GetFullPath(file); LogManager.Log("Found game: {0}, full path: {1}", game.GameName, path); UserGameInfo info = new UserGameInfo(); info.InitializeDefault(game, path); gameManager.User.Games.Add(info); } } stop.Stop(); LogManager.Log("> Took {0} seconds to search drive {1}", stop.Elapsed.TotalSeconds.ToString("0.00"), d.Name); } gameManager.SaveUserProfile(); gameManager.WaitSave(); }
private void SearchDrive(object state) { int i = (int)state; SearchDriveInfo info = toSearch[i]; if (!info.drive.IsReady) { done++; return; } LogManager.Log("> Searching drive {0} for game executables", info.drive.Name); Dictionary<ulong, FileNameAndParentFrn> mDict = new Dictionary<ulong, FileNameAndParentFrn>(); MFTReader mft = new MFTReader(); mft.Drive = info.drive.RootDirectory.FullName; mft.EnumerateVolume(out mDict, new string[] { ".exe" }); progress += (1 / (float)toSearch.Count) / 2.0f; UpdateProgress(); float increment = (1 / (float)toSearch.Count) / (float)mDict.Count; foreach (KeyValuePair<UInt64, FileNameAndParentFrn> entry in mDict) { if (closed) { return; } progress += increment; FileNameAndParentFrn file = (FileNameAndParentFrn)entry.Value; string name = file.Name; string lower = name.ToLower(); if (GameManager.Instance.AnyGame(lower)) { string path = mft.GetFullPath(file); if (path.Contains("$Recycle.Bin")) { // noope continue; } UserGameInfo uinfo = GameManager.Instance.TryAddGame(path); if (uinfo != null) { LogManager.Log("> Found new game {0} on drive {1}", uinfo.Game.GameName, info.drive.Name); Invoke(new Action(delegate { listGames.Items.Add(uinfo.Game.GameName + " - " + path); listGames.Invalidate(); main.NewUserGame(uinfo); })); } } } if (closed) { return; } UpdateProgress(); done++; if (done == toSearch.Count) { searching = false; Invoke(new Action(delegate { progress = 1; UpdateProgress(); btnSearch.Enabled = true; main.RefreshGames(); MessageBox.Show("Finished searching!"); })); } }