.NET TIPS

進行状況を表示しながらディレクトリやファイルをコピー/移動/削除するには?(My機能活用)[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/02/24

 アプリケーションでディレクトリあるいはファイルをコピーや移動する際、ファイルが巨大だったり、ファイルの数が多かったりした場合には、その進行状況をユーザーにダイアログなどで示すべきである。

 しかしながら「TIPS:ディレクトリを作成/削除/リネーム/移動するには?」や「TIPS:ファイルをコピー/削除/リネーム/移動するには?」で示されている、System.IO名前空間のクラスを使用したコピーや移動では、そのようなダイアログを表示させることは不可能だ。

 VBのMy機能の1つとして提供されているファイル操作機能では、オプションの指定によりコピーや移動中にその進行状況を示す、以下のようなダイアログを表示させることができる。


My機能によるコピー中に表示される進行状況ダイアログ
ファイル操作のメソッドを呼び出すだけで、このようなダイアログを表示させることができる。これはエクスプローラでのファイル操作時に表示されるダイアログと同じであり、[キャンセル]ボタンによりコピーを中断することもできる。

 本稿では、My機能として提供されている進行状況ダイアログ付きのディレクトリ/ファイル操作をVB、そしてC#から利用する方法についてまとめる。

My機能として提供されるファイル操作メソッド

 以下に示しているメソッドが、My機能として提供されているファイル操作メソッドの一覧である。

 これらのメソッドは、VBでは「My.Computer.FileSystem.CopyDirectory(……)」のように記述して呼び出すことができる。C#からは、FileSystemクラス(Microsoft.VisualBasic.FileIO名前空間)の静的メソッドとして呼び出す(具体例は後掲のサンプル・プログラムを参照)。

CopyDirectory(コピー元ディレクトリ, コピー先ディレクトリ)
CopyDirectory(同上, 同上, overwrite)
CopyDirectory(同上, 同上, UIOption)
CopyDirectory(同上, 同上, UIOption, UICancelOption)

CopyFile(コピー元ファイル, コピー先ファイル)
CopyFile(同上, 同上, overwrite)
CopyFile(同上, 同上, UIOption)
CopyFile(同上, 同上, UIOption, UICancelOption)

DeleteDirectory(ディレクトリ, DeleteDirectoryOption)
DeleteDirectory(同上, UIOption, RecycleOption)
DeleteDirectory(同上, UIOption, RecycleOption, UICancelOption)

DeleteFile(ファイル)
DeleteFile(同上, UIOption, RecycleOption)
DeleteFile(同上, UIOption, RecycleOption, UICancelOption)

MoveDirectory(移動元ディレクトリ, 移動先ディレクトリ)
MoveDirectory(同上, 同上, overwrite)
MoveDirectory(同上, 同上, UIOption)
MoveDirectory(同上, 同上, UIOption, UICancelOption)

MoveFile(移動元ファイル, 移動先ファイル)
MoveFile(同上, 同上, overwrite)
MoveFile(同上, 同上, UIOption)
MoveFile(同上, 同上, UIOption, UICancelOption)
VBのMy機能で提供されているファイル操作メソッド一覧
これらのメソッドのうち、UIOption列挙体の値を指定するメソッドが進行状況ダイアログを表示する。すべてのメソッドは静的メソッドで、戻り値はない。パラメータ「overwrite」には上書きするかどうかを示すBoolean値を指定する。UIOptionやUICancelOptionなどパラメータは、Microsoft.VisualBasic.FileIO名前空間の列挙体の値を指定することを示している。

 これらのメソッドのうち、パラメータとしてUIOption列挙体の値を指定するメソッドが、進行状況ダイアログ(プログレス・ダイアログ・ボックスとも呼ばれる)を表示する。

 以下にそれらのメソッドのパラメータで指定可能な列挙体の値の一覧を示す。

列挙体 列挙体の値 説明
UIOption OnlyErrorDialogs エラー・ダイアログのみを表示する
AllDialogs 進行状況ダイアログとエラー・ダイアログを表示する
UICancelOption DoNothing [キャンセル]ボタンがクリックされても例外を発生しない
ThrowException [キャンセル]ボタンがクリックされると例外を発生する(デフォルト)
RecycleOption DeletePermanently 完全に削除する(デフォルト)
SendToRecycleBin [ごみ箱]に送る
進行状況ダイアログを表示するメソッドで使用される列挙体
これら3つの列挙体はすべてMicrosoft.VisualBasic.FileIO名前空間に属している。

 この表にもあるように、進行状況ダイアログの表示中に[キャンセル]ボタンがクリックされた場合には、デフォルトではOperationCanceledException例外(System名前空間)が発生するが、UICancelOptionパラメータでUICancelOption.DoNothingを指定しておけば、操作が中断されるだけで例外は発生しない。

 ちなみに、進行状況ダイアログを表示するメソッドは、Windowsのシェル機能を利用してディレクトリやファイルの操作を行う。このため次のような上書き確認のダイアログが表示されたりもする。


[フォルダの上書きの確認]ダイアログ
デフォルトでは[いいえ]や[キャンセル]ボタンをクリックすると例外が発生する。

My機能のディレクトリ操作を利用したサンプル・プログラム

 最後に、My機能を使って進行状況ダイアログを表示しながらディレクトリのコピー/移動/削除を行う簡単なサンプル・プログラムを示しておく。ここではコンソール・アプリケーションとして記述しているが、この場合にも進行状況ダイアログは正しく表示される。

// progresscopy.cs

using Microsoft.VisualBasic.FileIO;

class ProgressBarCopy {
  static void Main() {

    string copySrc = @"C:\WINDOWS\Microsoft.NET";
    string copyDest = @"C:\TipsTmp";

    FileSystem.CopyDirectory(
      copySrc, copyDest, UIOption.AllDialogs);
    // C:\WINDOWS\Microsoft.NET配下のディレクトリ/ファイルが
    // C:\TipsTmpにコピーされる。
    // C:\TipsTmpは無ければ自動的に作成される。

    string moveDest = @"C:\TipsTmp2";

    FileSystem.MoveDirectory(
      copyDest, moveDest, UIOption.AllDialogs);
    // C:\TipsTmpをC:\TipsTmp2に移動

    FileSystem.DeleteDirectory(
      moveDest, UIOption.AllDialogs,
      RecycleOption.SendToRecycleBin);
    // C:\TipsTmp2ディレクトリを削除(ごみ箱に移動)
  }
}

// コンパイル方法:csc /r:Microsoft.VisualBasic.dll progresscopy.cs
進行状況を表示しながらディレクトリのコピー/移動/削除を行うC#のサンプル・プログラム(progresscopy.cs)
このプログラムは最終的にC:\TipsTmpディレクトリを削除してしまうので実行には注意してほしい。なおこのコードをVS 2005でビルドするには、事前にMicrosoft.VisualBasicアセンブリへの参照を追加しておく必要がある。

' progresscopy.vb

Class ProgressBarCopy
  Shared Sub Main()

    Dim copySrc As String = "C:\WINDOWS\Microsoft.NET"
    Dim copyDest As String = "C:\TipsTmp"

    My.Computer.FileSystem.CopyDirectory( _
      copySrc, copyDest, FileIO.UIOption.AllDialogs)
    ' C:\WINDOWS\Microsoft.NET配下のディレクトリ/ファイルが
    ' C:\TipsTmpにコピーされる。
    ' C:\TipsTmpは無ければ自動的に作成される。

    Dim moveDest As String = "C:\TipsTmp2"

    My.Computer.FileSystem.MoveDirectory( _
      copyDest, moveDest, FileIO.UIOption.AllDialogs)
    ' C:\TipsTmpをC:\TipsTmp2に移動

    My.Computer.FileSystem.DeleteDirectory( _
      moveDest, FileIO.UIOption.AllDialogs,  _
      FileIO.RecycleOption.SendToRecycleBin)
    ' C:\TipsTmp2ディレクトリを削除(ごみ箱に移動)
  End Sub
End Class

' コンパイル方法:vbc progresscopy.vb
進行状況を表示しながらディレクトリのコピー/移動/削除を行うVBのサンプル・プログラム(progresscopy.vb)
このプログラムは最終的にC:\TipsTmpディレクトリを削除してしまうので実行には注意してほしい。

 C#版のサンプル・プログラムをVisual Studio 2005でビルドする場合には、Microsoft.VisualBasic.dllを参照設定する必要がある。これについては「TIPS:C#からVBのMy機能を利用するには?」を参考にしていただきたい。

 なお、いずれのメソッドにおいても、コピー先や移動先のディレクトリが存在しない場合には自動的に作成される。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:FileSystemクラス(Microsoft.VisualBasic.FileIO名前空間)
使用ライブラリ:UIOption列挙体(Microsoft.VisualBasic.FileIO名前空間)
使用ライブラリ:UICancelOption列挙体(Microsoft.VisualBasic.FileIO名前空間)
使用ライブラリ:RecycleOption列挙体(Microsoft.VisualBasic.FileIO名前空間)
関連TIPS:ディレクトリを作成/削除/リネーム/移動するには?
関連TIPS:ファイルをコピー/削除/リネーム/移動するには?
関連TIPS:C#からVBのMy機能を利用するには?

この記事と関連性の高い別の.NET TIPS
時間がかかる処理の進行状況をダイアログで表示するには?
ファイルをごみ箱に入れるには?(My機能活用)
ファイルをコピー/削除/リネーム/移動するには?
ディレクトリを作成/削除/リネーム/移動するには?
C#からVBのMy機能を利用するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間