- PR -

ファイルコピー中のプログレスバー表示について

投稿者投稿内容
Chata
会議室デビュー日: 2004/04/16
投稿数: 12
投稿日時: 2004-05-30 15:14
いつも大変勉強させて頂いております。

早速ですが、表題の通りファイルコピー中の進行状況を知るための
プログレスバーを作成したいと考えております。

プログレスバーのMaximum値にコピー元のファイルサイズを設定して
作成すると思うのですが、コピー中のプログレスバーのValue値に何
をどう設定して良いのか判りません。

大変初歩的な質問で申し訳ありませんが、何卒宜しくお願い致します。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-05-30 15:22
こんにちは。

valueに入れる値はなんでも良いですが
ある程度規則があった方が良いです。
でないと、プログレスが一気に進んだり、なかなか進まなかったり
します。
ただし、最小値より小さく、最大値より大きい値の設定は論外です。

_________________
Hirashige
常連さん
会議室デビュー日: 2002/10/26
投稿数: 29
投稿日時: 2004-05-30 16:54
引用:

Chataさんの書き込み (2004-05-30 15:14) より:

プログレスバーのMaximum値にコピー元のファイルサイズを設定して
作成すると思うのですが、コピー中のプログレスバーのValue値に何
をどう設定して良いのか判りません。



 Value値には進行状況をセットします。
 例えば、2,000,000バイトのファイルをコピーするループの中で、1,000,000バイトを処理済みなら、1,000,000をセットします。
 だけど、普通はMaximum値にファイルサイズをそのまま指定しないと思います。Maximum値はintですからWin16時代なら直ぐにオーバーフローしますし、.NETの場合でもInt32で約2Gのファイルまでしか扱えません。
 私は、Maximum値はデフォルトの100のままで、Value値はループの中で処理済みを%に計算してセットしています。
 それと余計な事ですが、Application.DoEvents() を実行しないと、コピー処理などにCPUを占有されているときなど、セットしたValue値がなかなか反映されないことがあります。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-30 18:30
 たとえば、DOSのCOPYコマンドや、System.IOネームスペース以下のクラスメソッドを使用してコピーすると、プログレスバーをを出せないのですが、それはよろしいですか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-30 19:03
引用:

Jittaさんの書き込み (2004-05-30 18:30) より:
 たとえば、DOSのCOPYコマンドや、System.IOネームスペース以下のクラスメソッドを使用してコピーすると、プログレスバーをを出せないのですが、それはよろしいですか?


Jittaさんの仰るように、プログレスバーを表示するためには、コピー等の処理中にWindowに制御を随時戻してやる必要があります(まあ、擬似的にも出来なくはないですが)。
これが例えば、大量ファイル(大サイズではなく多数)のコピーなどならまだいいですが、大きいファイル一つのコピーとかだと難しいと思います。

まずコピー操作を非同期に行って、定期的に現在の進行状況からプログレスを表示する事になると思いますが、定期的に進行状況を取れるのかが良く分かりません。
# ファイルのコピー中って、その時点でのサイズを取るとかは無理でしたっけ?
# API使った方が無難な気がしないでもないですね。

って、元の質問の部分からはずれてますが、この辺の事は大丈夫ですか?
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-31 08:04
私もちょっと脇道にそれちゃいますが……
引用:

Jittaさんの書き込み (2004-05-30 18:30) より:
 たとえば、DOSのCOPYコマンドや、System.IOネームスペース以下のクラスメソッドを使用してコピーすると、プログレスバーをを出せないのですが、それはよろしいですか?


引用:

なちゃさんの書き込み (2004-05-30 19:03) より:
# ファイルのコピー中って、その時点でのサイズを取るとかは無理でしたっけ?
# API使った方が無難な気がしないでもないですね。


StreamのReadとWriteとで地道に読み書きをするつもり、ってことでしょうかね?
(その方法ならば出来なくもない、でしょうけど……。)

もしもこの場合だとすると、各種Copyと違って、コピー先は単なる新規作成ですからファイル日付や属性とか、色々考えなければならなかったり。(他、実行速度も気になったり……。)
Chata
会議室デビュー日: 2004/04/16
投稿数: 12
投稿日時: 2004-05-31 09:25
ご返答、有り難うございます。

引用:

Hirashigeさんの書き込み (2004-05-30 16:54) より:

 Value値には進行状況をセットします。

 (省略)

 私は、Maximum値はデフォルトの100のままで、Value値はループの中で処理済みを%に計算してセットしています。



上記の件でお聞きしたいのですが、「ループの中で処理済みを%で計算」というのは
コピー元ファイルの内、現在どれくらいの容量のコピーが済んでいるのかを算出する
という事だど思うのですが、この算出方法が判りません。

もし宜しければ、ご教授下さる様お願い致します。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-31 11:18
引用:

Chataさんの書き込み (2004-05-31 09:25) より:

上記の件でお聞きしたいのですが、「ループの中で処理済みを%で計算」というのは
コピー元ファイルの内、現在どれくらいの容量のコピーが済んでいるのかを算出する
という事だど思うのですが、この算出方法が判りません。


単なる計算の問題ですか?それとも処理済サイズを求める方法ですか?
計算の側はOverflow(早くも今年発生した「西暦2038年問題」のような)さえ気をつければいいとして……。

処理済サイズを求めるのは、コピー方法、あるいはOSやファイルシステム等の各種環境に依存すると思います。
私が先ほど書いたような、StreamのReadとWriteの組み合わせなら、自分でバッファを用意して読み書きするので把握はできるでしょう。
(とはいえ本来のCOPY動作と違うところは自分で補わなければいけないですし、性能なども考慮しなければいけないなどもあります。)

System.IO.File.Copyなどのようなコピー機能の場合は、Jittaさんのおっしゃる通り難しいと思います。

スキルアップ/キャリアアップ(JOB@IT)