Created
October 23, 2019 20:58
-
-
Save adacola/4cf2daf711f45b1f019a87e139ac7a05 to your computer and use it in GitHub Desktop.
コピー元ディレクトリ内にあるzipファイルをすべて展開しつつコピー先ディレクトリにファイルをコピー。多段zip対応。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#r "System.IO.Compression.dll" | |
#r "System.IO.Compression.FileSystem.dll" | |
open System.IO | |
open System.IO.Compression | |
let rec extractAll sourceDir targetDir = | |
let copyAll sourceDir targetDir = | |
let rec loop tasks sourceDir targetDir = | |
let tasks = (tasks, Directory.EnumerateFiles sourceDir) ||> Seq.fold (fun tasks sourceFile -> | |
async { | |
use sourceStream = File.OpenRead(sourceFile) | |
let targetFile = Path.Combine(targetDir, Path.GetFileName sourceFile) | |
use targetStream = File.Open(targetFile, FileMode.Create) | |
return! sourceStream.CopyToAsync targetStream |> Async.AwaitTask | |
}::tasks) | |
(tasks, Directory.EnumerateDirectories sourceDir) ||> Seq.fold (fun tasks sourceDir -> | |
let targetDir = Path.Combine(targetDir, Path.GetFileName sourceDir) | |
Directory.CreateDirectory(targetDir) |> ignore | |
loop tasks sourceDir targetDir) | |
async { | |
return! loop [] sourceDir targetDir |> Async.Parallel |> Async.Ignore | |
} | |
let findZip dir = | |
let rec loop result dir = | |
let result = Directory.EnumerateFiles(dir, "*.zip") |> Seq.fold (fun s x -> x::s) result | |
Directory.EnumerateDirectories dir |> Seq.fold loop result | |
async { return loop [] dir } | |
let extractZip archiveFile = async { | |
let dir = Path.GetDirectoryName archiveFile | |
do ZipFile.ExtractToDirectory(archiveFile, dir) | |
return File.Delete archiveFile | |
} | |
let rec extractAllZip dir = async { | |
match! findZip dir with | |
| [] -> return () | |
| zips -> | |
do! zips |> Seq.map extractZip |> Async.Parallel |> Async.Ignore | |
return! extractAllZip dir | |
} | |
async { | |
do! copyAll sourceDir targetDir | |
return! extractAllZip targetDir | |
} | |
let sourceDir = @"コピー元ディレクトリ" | |
let targetDir = @"コピー先ディレクトリ" | |
let main() = | |
Directory.Delete(targetDir, true) | |
Directory.CreateDirectory targetDir |> ignore | |
extractAll sourceDir targetDir |> Async.RunSynchronously |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment