- PR -

ProgressBarについて

1
投稿者投稿内容
MokiMoki
会議室デビュー日: 2004/11/22
投稿数: 19
投稿日時: 2004-11-22 21:28
はじめまして。
C#を勉強する目的でまずは、あるファイルをxxフォルダからyyフォルダにコピーするコードを記述しました。
そこにProgressBarを追加してコピーの進行状況を表示したいのですが・・・・詰まっちゃいました。
過去ログやTIPS等を拝見しましたが複数ファイルのコピーや読み込み等の記述でした。
行いたいのは1つのファイル(実はmdb)のコピーに対してProgressBarで進行状況を表示したいと思っております。
可能でしょうか?可能であれば参考となるurlだけでも結構なのでご教授願います。

以下、コーディング例
string fileName = "tttt.mdb";
FileInfo fi = new FileInfo(fileName);
Directory.CreateDirectory(@"\\work");
fi.Copyto(@"\\work\\" + fileName);
↑この処理の進行状況をProgressBarで表示したいと考えております。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-22 23:58
 CopyToでやっちゃうと、そのメソッドは処理が終わるまでブロックしてしまうので、できません。2つのファイルを開いて、メモリ上に取り込みながらコピーすると、できます。
 Win32APIの、SHなんとか辺りをラップすれば、標準のプログレスウインドウを表示できます。
#開発環境入れたマシンがポシャっているので…
_________________
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-23 09:06
諸農です。

方法は色々あると思います。

次のコードは、バイト配列を使ってコピー処理を行いながら、
その進行状況をProgressBarで表現する方法です。

フォームにLabelコントロールを2個、Buttonコントロールを2個、
ProgressBar、OpenFileDialog、SaveFileDialogコントロールを
それぞれ1個ずつ配置しておきます。

ProgressBarの進行は100回でマックスになるように
コピー元のファイルのサイズから計算して求めておき、
コピー用のメソッド内で、そのサイズ分でProgressBarの
進行状況を通知してもらっています。

コード:

private void button1_Click(object sender, System.EventArgs e)
{
openFileDialog1.FileName = "";
saveFileDialog1.FileName = "";
if (openFileDialog1.ShowDialog() != DialogResult.OK) return;
label1.Text = openFileDialog1.FileName;
if (saveFileDialog1.ShowDialog() != DialogResult.OK) return;
label2.Text = saveFileDialog1.FileName;
}

private void button2_Click(object sender, System.EventArgs e)
{
button1.Enabled = false;
button2.Enabled = false;
try
{
progressBar1.Minimum = 0;
progressBar1.Maximum = 100;
progressBar1.Value = 0;
progressBar1.Step = 1;

FileInfo fi = new FileInfo(label1.Text);
long incSize = 0;
if (fi.Length > 100) incSize = fi.Length / 100;
else
{
progressBar1.Maximum = (int)fi.Length;
incSize = 1;
}

if (MyFileCopy(label1.Text,label2.Text,incSize,
new ProgressBarIncrementEvent(MyProgressBarIncrementEvent)))
MessageBox.Show("ファイルのコピーが終了しました");
else
MessageBox.Show("ファイルのコピーに失敗しました");
}
finally
{
button1.Enabled = true;
button2.Enabled = true;
}
}

delegate void ProgressBarIncrementEvent(object sender,ref bool AbortFlg);
private void MyProgressBarIncrementEvent(object sender,ref bool AbortFlg)
{
progressBar1.PerformStep();
Application.DoEvents();
}

private bool MyFileCopy(string ASourceFile,string ADestFile,long AInvokeSize,ProgressBarIncrementEvent AIncEvent)
{
bool AbortFlg = false;
byte[] buf = new byte[AInvokeSize];
using (FileStream srcFile = new FileStream(ASourceFile,FileMode.Open,FileAccess.Read,FileShare.None))
{
using (FileStream dstFile = new FileStream(ADestFile,FileMode.Create,FileAccess.Write,FileShare.None))
{
int readSize = 0;
while((readSize = srcFile.Read(buf,0,buf.Length)) != 0)
{
dstFile.Write(buf,0,readSize);
AIncEvent(this,ref AbortFlg);
if (AbortFlg) break;
}
}
}
FileInfo sFile = new FileInfo(ASourceFile);
FileInfo dFile = new FileInfo(ADestFile);
return sFile.Length == dFile.Length;
}



--編集追加--
コピー処理中に処理中断が出来るように変更

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-11-23 10:02 ]
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2004-11-23 10:49
ご参考に
http://blogs.users.gr.jp/naka/articles/2643.aspx
中博俊
ベテラン
会議室デビュー日: 2004/10/17
投稿数: 91
お住まい・勤務地: 大阪市
投稿日時: 2004-11-23 10:49
ご参考に
http://blogs.users.gr.jp/naka/articles/2643.aspx
MokiMoki
会議室デビュー日: 2004/11/22
投稿数: 19
投稿日時: 2004-11-23 14:24
Jitta様
やはりCopyToではブロックされちゃうのですね。
ちょうどそこで詰まって、色々とサーチエンジンやこちらの過去ログ等を参考にさせて頂いておりました。
自分の調べ方が悪くて、やりたいことができないと思っておりましたが一安心です。
>Win32APIの、SHなんとか・・・・
ご教授ありがとうございます。実は私、今まで開発言語はCOBOLでした。
いろいろと頑張って調べてみます。また詰まったら調べ方でも宜しいですのでご教授願います。

諸農様
サンプルプログラムまで付与させて頂きありがとうございます。
すみません勉強不足でmdbをバイト配列を使ってコピーすることすらわかりませんでした。
諸農様のコードを参考にしてもう一度、頑張ってみます。

中様
先ほどurlを拝見しました。
私にとって意味不明のコードが多々記述されていましたがJitta様からご教授させて頂きましたWin32API
の方法だということがなんとなくわかりました。こちらに関してもご参考にさせて頂きます。

追伸
C#を始めて間もないこともあり、自分の勉強不足がよくわかりました。
皆様の助言、感謝しております。どうもありがとうございます。
また、何かありましたら宜しくお願いします。
1

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