Esempio n. 1
0
        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();
                    }
                }
            });
        }
Esempio n. 2
0
        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());
            }
        }