// Read all of the files under a path into a list of MusicFolder class static public MusicFolder EnumerateMusicFolder(string sDir, BackgroundWorker worker, DoWorkEventArgs e, Func <BackgroundWorker, DoWorkEventArgs, bool> checkForCancel) { List <MusicFile> musicFiles = null; musicFiles = EnumerateFilesInPath(sDir, musicFiles, worker, e, checkForCancel); MusicFolder musicFolder = new MusicFolder(sDir, musicFiles); return(musicFolder); }
// Begin the scan process widgets static public string scanMusicFolder(string folderName, List <MusicFile> workingFiles, BackgroundWorker worker, DoWorkEventArgs e) { int addedCount = 0; int deletedCount = 0; FileInfo masterManifest = new FileInfo(Path.GetFullPath(folderName) + "\\" + Constants.ManifestFilename); MusicFolder scannedMasterMusic = null; MusicFolder manifestMasterMusic = null; int percentComplete = 0; // Scan the master folder and build a fresh list Console.WriteLine("Scan the folder for music files...."); percentComplete = 20; worker.ReportProgress(percentComplete, "Scan the folder for music files...."); scannedMasterMusic = FileUtils.EnumerateMusicFolder(folderName, worker, e, checkForCancel); // If we have a previous manifest on the master folder, read it in Console.WriteLine("Look for a manifest file in the folder...."); percentComplete = 40; worker.ReportProgress(percentComplete, "Look for a manifest file in the folder...."); if (checkForCancel(worker, e)) { return("Cancelled."); } if (masterManifest.Exists) { string json = File.ReadAllText(masterManifest.FullName); manifestMasterMusic = Newtonsoft.Json.JsonConvert.DeserializeObject <MusicFolder>(json); } else { manifestMasterMusic = new MusicFolder(folderName, null); string json = Newtonsoft.Json.JsonConvert.SerializeObject(scannedMasterMusic, Newtonsoft.Json.Formatting.Indented); try { File.WriteAllText(masterManifest.FullName, json); } catch { MessageBoxResult result = MessageBox.Show( "Could not write the manifest file to " + masterManifest.FullName, "Cannot create music manifest", MessageBoxButton.OK, MessageBoxImage.Question); } } // Go through all the recently scanned files to see if any are not in the disk list (new files) Console.WriteLine("Chew through all the files we just scanned...."); percentComplete = 60; worker.ReportProgress(percentComplete, "Chew through all the files we just scanned...."); foreach (MusicFile currentFile in scannedMasterMusic.musicFiles) { MusicFile searchFile = null; worker.ReportProgress(percentComplete, "Process " + currentFile.fileName); if (checkForCancel(worker, e)) { return("Cancelled."); } if (manifestMasterMusic.musicFiles != null) { searchFile = manifestMasterMusic.musicFiles.Find(srch => srch.fileName == currentFile.fileName); } currentFile.isProcessed = true; // If the file exists in the disk manifest, then we are good if (searchFile != null) { searchFile.isProcessed = true; currentFile.status = MusicFile.MusicFileStatus.Old; searchFile.status = MusicFile.MusicFileStatus.Old; } else // Not in the disk manifest means a new file, add to our working list { MusicFile newFile = new MusicFile(currentFile.fileName); currentFile.status = MusicFile.MusicFileStatus.New; newFile.status = MusicFile.MusicFileStatus.New; addedCount++; workingFiles.Add(newFile); } } // Now go through the disk list and mark any unprocessed as deleted from the master Console.WriteLine("Now walk all the manifest files looking for deleted ones...."); percentComplete = 80; worker.ReportProgress(percentComplete, "Now walk all the manifest files looking for deleted ones...."); if (manifestMasterMusic.musicFiles != null) { foreach (MusicFile currentFile in manifestMasterMusic.musicFiles) { worker.ReportProgress(percentComplete, "Scrub " + currentFile.fileName); if (checkForCancel(worker, e)) { return("Cancelled."); } if (currentFile.isProcessed == false) { currentFile.isProcessed = true; MusicFile newFile = new MusicFile(currentFile.fileName); currentFile.status = MusicFile.MusicFileStatus.Deleted; newFile.status = MusicFile.MusicFileStatus.Deleted; deletedCount++; //workingFiles.Add(newFile); } } } Console.WriteLine("Scanning process is complete...."); percentComplete = 100; worker.ReportProgress(percentComplete, "Scanning process is complete...."); return(manifestMasterMusic.musicFiles.Count + " files in library, " + scannedMasterMusic.musicFiles.Count + " files scanned, " + addedCount + " files added, " + deletedCount + " files deleted, " + workingFiles.Count + " files to process."); }
private void asyncScanner_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; e.Result = MusicFolder.scanMusicFolder((string)e.Argument, workingList, worker, e); }