コード例 #1
0
        private void AppendDirectoryCore(StoragePath source, StoragePath level)
        {
            // Copy each file into the new directory.
            foreach (var file in Directory.EnumerateFiles(source.ToString()).Select(x => new StoragePath(x)))
            {
                this.AddExisting(level + file.Name, file);
            }

            // Copy each subdirectory using recursion.
            foreach (var sub in Directory.EnumerateDirectories(source.ToString()).Select(x => new StoragePath(x)))
            {
                this.AddDirectory(level + sub.Name);
                AppendDirectoryCore(sub, level + sub.Name);
            }
        }
コード例 #2
0
        private void DeleteDirectoryCore(StoragePath source, StoragePath level)
        {
            // Delete each file in the directory.
            foreach (string file in Directory.EnumerateFiles(source.ToString()))
            {
                File.Delete(file);
            }

            // Delete each subdirectory using recursion.
            foreach (var sub in Directory.EnumerateDirectories(source.ToString()).Select(x => new StoragePath(x)))
            {
                DeleteDirectoryCore(sub, level + sub.Name);
            }

            Directory.Delete(source.ToString());
        }
コード例 #3
0
        /// <summary>
        /// Runs all operations on the target directory asynchronously
        /// </summary>
        public async Task BuildAsync()
        {
            if (!Directory.Exists(this.RootDirectory.ToString()))
            {
                Directory.CreateDirectory(this.RootDirectory.ToString());
            }

            // Delete files and folders
            foreach (var item in this.deletions)
            {
                if (File.Exists(item.ToString()))
                {
                    File.Delete(item.ToString());
                }
                else
                {
                    this.DeleteDirectoryCore(item, new StoragePath());
                }
            }

            // Build existing directories
            foreach (var item in this.existing)
            {
                AppendDirectoryCore(item.Item2, item.Item1);
            }
            this.existing.Clear();

            // Read all zip files
            foreach (var item in this.zips)
            {
                using (item) {
                    foreach (var entry in item.Entries)
                    {
                        var stream = entry.Open();
                        this.AppendFile(entry.FullName, () => stream);
                    }
                }
            }
            this.zips.Clear();

            // Build directories
            foreach (var item in this.directories)
            {
                string dir = this.RootDirectory.Combine(item).ToString();

                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }
            }
            ;
            this.directories.Clear();

            // Build files
            foreach (var item in this.filesToBuild)
            {
                async Task WriteFile(string p, FileMode mode)
                {
                    using (FileStream writer = new FileStream(p, mode)) {
                        using (var reader = item.Stream) {
                            await reader.CopyToAsync(writer);
                        }

                        await writer.FlushAsync();
                    }
                }

                StoragePath path = this.RootDirectory + item.Path;
                string      dir  = path.ParentDirectory.ToString();

                if (!Directory.Exists(dir))
                {
                    Directory.CreateDirectory(dir);
                }

                bool targetExists = File.Exists(path.ToString());
                if (this.ConflictResolution == NameConflictOption.ThrowException && targetExists)
                {
                    throw new IOException($"The file '{Path.GetFileName(path.ToString())}' already exists");
                }
                else if (this.ConflictResolution == NameConflictOption.Skip && targetExists)
                {
                    continue;
                }
                else if (this.ConflictResolution == NameConflictOption.Rename && targetExists)
                {
                    await WriteFile(ResolveFileName(path.ToString()), FileMode.Create);
                }
                else
                {
                    await WriteFile(path.ToString(), FileMode.Create);
                }
            }
            ;
            this.filesToBuild.Clear();
        }