Skip to content

Instantly share code, notes, and snippets.

@adacola
Created October 23, 2019 20:58
Show Gist options
  • Save adacola/4cf2daf711f45b1f019a87e139ac7a05 to your computer and use it in GitHub Desktop.
Save adacola/4cf2daf711f45b1f019a87e139ac7a05 to your computer and use it in GitHub Desktop.
コピー元ディレクトリ内にあるzipファイルをすべて展開しつつコピー先ディレクトリにファイルをコピー。多段zip対応。
#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