.NET TIPS

ドライブをフォーマットするためのダイアログを表示するには?

デジタルアドバンテージ 一色 政彦
2005/07/29

 Windows OSには、フロッピー・ディスクやハード・ディスクなどのドライブ(CD-RWドライブなどは含まない)をフォーマットするための機能と、それを操作するためのダイアログ(以降、フォーマット・ダイアログ)が用意されている。本稿では、.NETでこのダイアログを呼び出すための方法を紹介する。

 フォーマット・ダイアログを表示する機能はWin32 APIとしては用意されているが、.NET Frameworkのクラス・ライブラリには含まれていない。そのため、.NETのプログラムからWin32 APIを呼び出す必要がある(なお.NETでWin32 APIを利用する方法については、「TIPS:Win32 APIやDLL関数を呼び出すには?」を参照されたい)。具体的には、「SHFormatDrive」というWin32 APIを呼び出す。

 このWin32 APIを呼び出すためにC#やVB.NETで必要となる宣言定義は次のとおりだ。

[DllImport("shell32.dll")]
private static extern uint SHFormatDrive(
  IntPtr hwnd, int drive, int fmtID, int options);
<DllImport("Shell32.dll")> _
Private Shared Function SHFormatDrive( _
  ByVal hwnd As IntPtr, ByVal drive As Integer, _
  ByVal fmtID As Integer, ByVal options As Integer) As Long
End Function
フォーマット・ダイアログを表示するWin32 API「SHFormatDrive」の宣言(上:C#、下:VB.NET)
厳密には、C#のサンプル・コードでuint型になっている個所は、VB.NETではUInt32型にするのが好ましい。しかしそうした場合、VB.NETではUInt32型変数に数値を代入するときに、Convert.ToUInt32メソッドなどを使ってデータ型を変換しなければならないので、コード量が増える。本稿の例では、同じ32bits整数型のInteger(Int32型)でも問題ないため、ここではInteger型で代用している。

 SHFormatDrive関数のパラメータと戻り値の意味については、次の表にまとめた。

項目 説明
hwnd(第1パラメータ) Windowsフォームのハンドルを指定する。Windowsフォームのハンドルは、フォームのHandleプロパティにより取得できる。もしフォーマット・ダイアログのオーナーとなるフォームを設定しない場合には、null(C#)/Nothing(VB.NET)を指定すればよい
drive(第2パラメータ) フォーマットするドライブの番号。Aドライブが「0」番で、以降、Bドライブ=「1」、Cドライブ=「2」というように順番に番号が割り当てられている
fmtID(第3パラメータ) フォーマットIDは物理フォーマットの識別子を指定するが、ここには常に「SHFMT_ID_DEFAULT」(デフォルトのフォーマットID。C#では「0xFFFF」、VB.NETでは「&HFFFF」という数値と同等)を指定すればよい
options(第4パラメータ) フォーマットのオプション。次のようなオプション値があるが、デフォルトのままでよい場合は「0」を指定しておけばよい。
・SHFMT_OPT_NORMAL:通常フォーマットのオプション
  → NT系では「0x0000(C#)/&H0(VB.NET)」
  → 9x系では「0x0001/&H1」
・SHFMT_OPT_QUICK:クイック・フォーマット
  → NT系では「0x0001/&H1」
  → 9x系では「0x0000/&H0」
・SHFMT_OPT_SYSONLY:起動ディスク作成用
  → NT系では利用不可(のようだ)
  → 9x系では「0x0002/&H2」
なおこれらのオプションは、OSによって、特にWindows NT系かWindows 9x系かによって数値が変わるので注意すること。特にWindows NT 4.0などではオプション指定自体が無視される
戻り値 最後に成功したフォーマットのフォーマットID。もしくは、失敗した場合には、
・「SHFMT_ERROR」
   =「0xFFFFFFFF(C#)/&HFFFFFFFF(VB.NET)」
・「SHFMT_CANCEL」
   =「0xFFFFFFFE(C#)/&HFFFFFFFE(VB.NET)」
・「SHFMT_NOFORMAT」
   =「0xFFFFFFFD(C#)/&HFFFFFFFD(VB.NET)」
のいずれかの値になる。これらの値を受け取った場合、それはドライブがフォーマットされていないことを意味する
SHFormatDrive関数のパラメータと戻り値の意味

 以上が理解できたら、このAPIを呼び出すサンプル・プログラムのソース・コードを見てみよう。

private void button1_Click(object sender, System.EventArgs e)
{
  uint fmtID = 0; // 0:Aドライブ、2:Cドライブ、3:Dドライブ

  uint options = 0x0000; // オプションの値はOSによって異なる
  if (Environment.OSVersion.Platform == PlatformID.Win32NT)
  { // Windows NT系
    options = 0x0000; // SHFMT_OPT_NORMAL
    //options = 0x0001; // SHFMT_OPT_QUICK
    // Windows NT系ではSHFMT_OPT_SYSONLYを利用できない
  }
  else
  {  // Windows 9x系
    options = 0x0001; //  SHFMT_OPT_NORMAL
    //options = 0x0000; // SHFMT_OPT_QUICK
    //options = 0x0002; // SHFMT_OPT_SYSONLY
  }

  uint result = SHFormatDrive(this.Handle, fmtID, SHFMT_ID_DEFAULT, options);
  if ((result == SHFMT_ERROR) ||
    (result == SHFMT_CANCEL) ||
    (result == SHFMT_NOFORMAT))
  {
    MessageBox.Show("ドライブはフォーマットされていません。");
  }
  else
  {
    MessageBox.Show("ドライブをフォーマットしました。");
  }
}

// Win32 APIの宣言定義
[DllImport("shell32.dll")]
private static extern uint SHFormatDrive(
  IntPtr hwnd, uint drive, uint fmtID, uint options);

// フォーマットID(formatID)の定義
private const uint SHFMT_ID_DEFAULT = 0xFFFF;

// エラー時の特殊な戻り値の定義

private const uint SHFMT_ERROR    = 0xFFFFFFFF;
private const uint SHFMT_CANCEL   = 0xFFFFFFFE;
private const uint SHFMT_NOFORMAT = 0xFFFFFFFD;
Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
  Dim fmtID As Integer = 0   ' 0:Aドライブ、2:Cドライブ……

  Dim options As Integer = &H0    ' オプションの値はOSによって異なる
  If Environment.OSVersion.Platform = PlatformID.Win32NT Then
    ' Windows NT系
    options = &H0 ' SHFMT_OPT_NORMAL
    'optionFlag = &H1 ' SHFMT_OPT_QUICK
    ' Windows NT系ではSHFMT_OPT_SYSONLYを利用できない
  Else
    ' Windows 9x系
    options = &H1 '  SHFMT_OPT_NORMAL
    'optionFlag = &H0 ' SHFMT_OPT_QUICK
    'optionFlag = &H2 ' SHFMT_OPT_SYSONLY
  End If

  Dim result As Integer = _
    SHFormatDrive(Me.Handle, fmtID, SHFMT_ID_DEFAULT, options)
  If (result = SHFMT_ERROR) OrElse _
     (result = SHFMT_CANCEL) OrElse _
     (result = SHFMT_NOFORMAT) Then
    MessageBox.Show("ドライブはフォーマットされていません。")
  Else
    MessageBox.Show("ドライブをフォーマットしました。")
  End If
End Sub

' Win32 APIの宣言定義
<DllImport("Shell32.dll")> _
Private Shared Function SHFormatDrive( _
  ByVal hwnd As IntPtr, ByVal drive As Integer, _
  ByVal fmtID As Integer, ByVal options As Integer) As Integer
End Function

' フォーマットID(formatID)の定義
Private Const SHFMT_ID_DEFAULT As Integer = &HFFFF

' エラー時の特殊な戻り値の定義
Private Const SHFMT_ERROR As Integer = &HFFFFFFFF
Private Const SHFMT_CANCEL As Integer = &HFFFFFFFE
Private Const SHFMT_NOFORMAT As Integer = &HFFFFFFFD
フォーマット・ダイアログを表示するサンプル・プログラム(上:C#、下:VB.NET)

 特に難しいところはないだろう。なおOS種別の判定については、「TIPS:Windows OSの種類やバージョンを判別するには?」を参照してほしい。

 それではこのプログラムを実行してみよう。

サンプル・プログラムの実行結果
[フォーマット・ダイアログを表示する]ボタンをクリックすると、このようなダイアログが表示される。

 実行すると、このようなフォーマット・ダイアログが表示されるはずだ。このフォーマット・ダイアログは、エクスプローラなどで表示されるドライブの上で右クリックして、そこで現れるコンテキスト・メニューから[プロパティ]を選択したときに表示されるダイアログとまったく同じものだ。End of Article

カテゴリ:Windowsフォーム 処理対象:ダイアログ
関連TIPS:Win32 APIやDLL関数を呼び出すには?
関連TIPS:Windows OSの種類やバージョンを判別するには?
 
この記事と関連性の高い別の.NET TIPS
Win32 APIやDLL関数を呼び出すには?
Win32 API呼び出しを手軽に記述するには?
実行ファイルからアプリケーションのアイコンを取得するには?
Win32 APIのWin32エラー・コードを取得するには?
INIファイルを読み書きするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間