質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

5回答

2999閲覧

c# zip圧縮 マルチスレッド

maple123

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

マルチスレッド

マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2018/07/14 12:00

編集2018/07/16 03:53

前提・実現したいこと

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

直接の回答ではなくてすみません。

質問者さんは、たぶん、以下の記事の「マルチスレッドの動作原理」セクションにある図の ③ をイメージされているのではないかと思います。

第1回 マルチスレッドはこんなときに使う (1/2)
http://www.atmarkit.co.jp/ait/articles/0503/12/news025.html

しかし、シングルコアのマシンでは ② のようになり、スレッドを切り替えるためのオーバーヘッドが発生して逆に遅くなるということは認識されてますか? そのあたりは初学者の人が陥りやすい誤解のようです。

マルチコアの能力を生かした高速処理(図の ③)を行うにはそのためのコーディングが必要です。

VS 2010、.NET 4 で導入された Parallelクラスを使うという手段があるそうで(下記の記事参照)、それ以前と比較して実装が容易になっているそうです。

Visual Studio 2010 の 優れた機能(3)マルチコア プログラミングへの対応
https://blogs.msdn.microsoft.com/myamada/2010/03/02/visual-studio-2010-1/

ループをParallelクラスで並列処理にするには?[C#/VB]
http://www.atmarkit.co.jp/ait/articles/1706/21/news021.html

上記が質問者の課題を解決できるかは分かりませんが、自力で課題を解決したいということであれば検討されてはいかがでしょう。

投稿2018/07/15 05:36

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

出力先が一つのファイルで、

並列処理で複数のファイル

ファイル毎に、圧縮処理を行い、一つのファイルにまとめるという事でしょうか?
それならば、ファイル毎に Zip(圧縮)処理を行い、その結果をマージする事になります。ただし、効率よく行うためには、専用の圧縮処理、解凍処理が必要となりますが、ここまでくると Zipと言うより、専用処理を検討すべきかと思います。

確か、Lhaの開発者だったかの人が、リアルタイム圧縮を開発していたかと思いますが、同様にすべき。

投稿2018/07/14 12:16

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maple123

2018/07/14 21:40

やはりzipは難しいでしょうか…
pepperleaf

2018/07/14 23:52

Zip圧縮は、ライブラリも公開されているので、それを使えば、簡単にできると思います。(使った事ないですが...) ただ、わざわざマルチスレッドで、と書かれているので、特別な理由があると思った次第です。マルチスレッドにするという事は、それぞれの処理に依存関係があると高速化できないので、ファイル毎に圧縮する事になります。 Zip圧縮 --> アーカイブ処理 の流れになり、そんな都合の良い方法と思った時、Zip圧縮と書かれていたので、専用処理(ファイル形式)の作成が必要かもと考え、そこまでするなら、Zipに拘る必要が無いのでは? と思った次第。 現状、Zipは、特定のコードに対し、最速でもコンパクトでも無いので、わざわざマルチスレッド(タスク?)にして高速化を図りたい要望に対しては、専用の方法が最適と考えました。
guest

0

  • 「C# ZIP」でぐぐる
  • 一つのファイルをZIP圧縮するコードを組む
  • 「C# parallel for」でぐぐる
  • 非同期で並列実行させて、複数のファイルをZIP圧縮させるようにコードを組む
  • バッチシ!

投稿2018/07/14 12:16

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maple123

2018/07/14 21:38

複数のファイルをそれぞれ1つずつ圧縮処理をしたいのではなく、複数のファイルを一つにまとめて圧縮したかったです。
y_waiwai

2018/07/14 23:39 編集

一つのzipにしたいというなら、C#標準のライブラリでは無理なので、他の方法を探す必要があります 他回答のように、各ファイルをzipにした上でマージするということになりますねー まー、まずは各ファイルを並列でzipにすることから始めましょう
guest

0

複数のファイルを同時に圧縮とするよりも、ファイルの読み込みと圧縮のスレッドを分ける方が良さそうな気がします
同じ物理ドライブに対して同時に読み込もうとしても時間の短縮にはならないと思いますので

投稿2018/07/15 20:09

len_souko

総合スコア1337

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maple123

2018/07/16 03:50

ファイルの読み込みと圧縮のスレッドを分ける件になりますが、 いい方法が思いつきませんでした。 プログラムを追加いたしましたのでよろしければ見ていただけないでしょうか。
guest

0

Zip圧縮 --> アーカイブ処理 を
parallel for each又は、ファイル分Taskを生成して、async awaitさせようと思います。

皆様有難う御座います。

一つ一つをzip化して最後にまとめるのが最善でしょうが、圧縮無しで、まとめてzipにしたかったのでそこは別途考えてみます。

投稿2018/07/15 10:53

maple123

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問