private static void WriteDiscMetaData(DiscData disc) { if (_test) { return; } var directory = Path.Combine(disc.Path, _metaDataFolder); CreateAndUseDirectory(directory, () => { using (var wtr = new StreamWriter(Path.Combine(directory, "discMetaData.js"))) { wtr.Write("window.archiverDiscMetaData = "); using (var json = new JsonTextWriter(wtr)) { json.WriteStartObject(); json.WritePropertyName("discNumber"); json.WriteValue(disc.DiscNumber); json.WriteEndObject(); json.Flush(); } } }); }
private static void AddFilesToDiscFolder(DiscData disc, IEnumerable <FileData> files, bool moveFiles) { if (_test) { if (moveFiles) { Log(" Not moving because we are in test mode"); } else { Log(" Not copying because we are in test mode"); } return; } var allFiles = files.SelectMany(x => x.Paths.Select(y => (Source: y.Full, Dest: Path.Combine(disc.Path, y.Relative)))).ToList(); var folders = allFiles.Select(x => Path.GetDirectoryName(x.Dest)).Distinct().ToList(); Log($" Ensuring {folders.Count} folders are created"); foreach (var folder in folders) { CreateAndUseDirectory(folder, () => { var testPath = Path.Combine(folder, "test.txt"); File.WriteAllText(testPath, "Test"); File.Delete(testPath); }); } var action = _copyOnly ? "Copy" : "Mov"; Log($" {action}ing {allFiles.Count} content files using {Environment.ProcessorCount} threads"); var queue = new ConcurrentQueue <(string Source, string Destination)>(allFiles); var threads = new Thread[Environment.ProcessorCount]; var finisher = new CountdownEvent(threads.Length); var errors = new List <Exception>(Environment.ProcessorCount); for (var i = 0; i < threads.Length; i++) { threads[i] = new Thread(() => { try { while (queue.TryDequeue(out var entry)) { if (!File.Exists(entry.Source)) { continue; } if (moveFiles) { File.Move(entry.Source, entry.Destination, true); } else { File.Copy(entry.Source, entry.Destination, true); } } } catch (Exception e) { errors.Add(e); } finally { finisher.Signal(); } }); threads[i].Start(); } finisher.Wait(); if (errors.Count > 0) { throw new AggregateException(errors.ToArray()); } }