前提・実現したいこと
c#で大量のファイルが入ったフォルダをマルチスレッドで高速で1つのzipに圧縮したい。
###環境
c#7.1 .net4.7 VS2017
###質問内容
一つのzipファイルに並列処理で複数のファイルを圧縮することはそもそも可能でしょうか?
###質問内容追加(20180716 12:47)
・zipファイル内にディレクトリができない
・並列で一つのzipファイルにアクセスする為例外発生
###C#
C#
1private void button2_Click(object sender, EventArgs e) 2{ 3 //FolderBrowserDialogクラスのインスタンスを作成 4 FolderBrowserDialog fbd = new FolderBrowserDialog(); 5 //上部に表示する説明テキストを指定する 6 fbd.Description = "フォルダを指定してください。"; 7 //ルートフォルダを指定する 8 //デフォルトでDesktop 9 fbd.RootFolder = Environment.SpecialFolder.Desktop; 10 //最初に選択するフォルダを指定する 11 //RootFolder以下にあるフォルダである必要がある 12 fbd.SelectedPath = @"C:\Windows"; 13 //ユーザーが新しいフォルダを作成できるようにする 14 //デフォルトでTrue 15 fbd.ShowNewFolderButton = true; 16 //ダイアログを表示する 17 if (fbd.ShowDialog(this) == DialogResult.OK) 18 { 19 //選択されたフォルダを表示する 20 Console.WriteLine(fbd.SelectedPath); 21 textBox1.Text = fbd.SelectedPath; 22 } 23 //ListBoxに一覧を表示する 24 listBox1.Items.Clear(); 25 var directries = Directory.GetDirectories(fbd.SelectedPath); 26 foreach (var directry in directries) 27 { 28 Console.WriteLine(directry); 29 listBox1.Items.Add(directry); 30 } 31} 32 33private void button1_Click(object sender, EventArgs e) 34{ 35 //デスクトップ 36 string zipFilePath = $@"{System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)}\test.zip"; 37 //ZIP書庫を作成 38 ZipFile.CreateFromDirectory(listBox1.Items[0].ToString(), zipFilePath); 39 //ディレクトリ分タスクを生成する 40 List<Task<bool>> task = new List<Task<bool>>(); 41 //読み取りと書き込みができるようにして、ZIP書庫を開く 42 using (ZipArchive ziparchive = ZipFile.Open(zipFilePath, ZipArchiveMode.Update)) 43 { 44 foreach (var directry in listBox1.Items) 45 { 46 task.Add(Task<bool>.Run(() => 47 { 48 string[] fileList = Directory.GetFiles(directry.ToString(), "*", SearchOption.AllDirectories); 49 foreach (var file in fileList) 50 { 51 Console.WriteLine(file); 52 ZipArchiveEntry x = ziparchive.CreateEntryFromFile(file, System.IO.Path.GetFileName(file)); 53 } 54 return true; 55 })); 56 } 57 Task.WhenAll(task); 58 } 59}

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。