コード例 #1
0
        public async Task DownloadToAsync(IDirectoryAccessor destinationRootDirectory, System.Threading.CancellationToken cancellation)
        {
            if (destinationRootDirectory.Access != IOAccess.FULL)
            {
                throw new NotSupportedException("Access denied");
            }

            foreach (var fileTask in EnumerateFilesAsync())
            {
                var file            = await fileTask;
                var destinationFile = await destinationRootDirectory.GetFileAsync(new UPath(PATH_FORMAT, file.Name), cancellation);

                using (var destinationFileStream = await destinationFile.OpenAsync(FileOpenMode.NEW, cancellation))
                    using (var fileStream = await file.OpenAsync(FileOpenMode.OPEN_OR_NEW, cancellation))
                    {
                        await fileStream.WriteToAsync(destinationFileStream, cancellation);
                    }
            }

            foreach (var innerDir in EnumerateDirectoriesAsync(cancellation))
            {
                var dir = await innerDir;
                var destinationDirectoryPath = new UPath(PATH_FORMAT, dir._rawData.path.RemoveFirst(_rawData.path));
                var destinationDirectory     = await destinationRootDirectory.GetDirectoryAsync(destinationDirectoryPath, cancellation);

                await destinationDirectory.EnsureCreatedAsync(cancellation);

                await dir.DownloadToAsync(destinationDirectory, cancellation);
            }
        }