[ C# ] FormatEx 関数でディスクをフォーマットする

Pocket

ここでは、C# からディスクのフォーマット(クイックフォーマット)を行うサンプルコードを掲載しています。なお、フォーマットを行うとディスク内のファイルはすべて削除されますのでバックアップするなど気をつけましょう。

スポンサーリンク

ディスクのフォーマットのサンプルコード

ディスクのフォーマット、クイックフォーマットを行うサンプルコードです。詳細はサンプル内のコメントを参照ください。
なお、フォーマット中にコールバックメソッドが定期的に呼び出されますが、コールバックの種類は、フォーマットとクイックフォーマットで異なるようですので、注意が必要です。

        // フォーマットAPI(FormatEx)の宣言
        [DllImport("fmifs.dll", CharSet = CharSet.Auto, EntryPoint = "FormatEx")]
        private static extern void FormatEx(string driveLetter, // ドライブレター
                                            Int32 mediaFlag,    // メディア種別
                                            string fsType,      // ファイルフォーマット(ex. NTFS FAT32)
                                            string label,       // ボリュームラベル
                                            Int32 quickFormat,  // クイックフォーマット?
                                            Int32 clusterSize,  // クラスタサイズ(0:デフォルト)
                                            FormatCallBackDelegate callBackDelegate); // コールバック関数

       /*
        * コールバック関数コール時のコマンドの種類
        */
       private enum CallbackCommand
        {
            PROGRESS,            // 進捗(クイックフォーマット時は呼び出されない)
            DONEWITHSTRUCTURE,
            UNKNOWN2,
            UNKNOWN3,
            UNKNOWN4,
            UNKNOWN5,
            INSUFFICIENTRIGHTS,
            UNKNOWN7,
            DISKLOCKEDFORACCESS, // UNKNOWN8, 
            UNKNOWN9,
            UNKNOWNA,
            DONE,               // フォーマット完了時(フォーマットエラー時も呼び出される)
            UNKNOWNC,
            UNKNOWND,
            OUTPUT,
            STRUCTUREPROGRESS   // クイックフォーマット時に呼び出される。進捗は取得できない(?)
        }

        /*
         * メディアの種別
         */
        private const Int32 FLOPPY_DISK     = 0x08; // フロッピーディスク
        private const Int32 HARD_DISK       = 0x0C; // ハードディスク
        private const Int32 REMOVEABLE_DISK = 0x0B; // リムーバルディスク

        // コールバック用のデリゲート
        private delegate Int32 FormatCallBackDelegate(CallbackCommand callBackCommand,
                                                      Int32 subActionCommand,
                                                      IntPtr action);

        // 定期的に繰り返し呼ばれるコールバック関数
        private static Int32 formatCallBack(CallbackCommand callBackCommand,
                                            int subActionCommand,
                                            IntPtr action)
        {
            switch (callBackCommand)
            {
                case CallbackCommand.DONE:
                    // フォーマット完了終了通知
                    if (action != IntPtr.Zero)
                    {
                        // フォーマットの結果を取得
                        int ret = Marshal.ReadByte(action);
                        if (ret == 1) {
                            Console.WriteLine("フォーマット正常終了");
                        } else {
                            Console.WriteLine("フォーマット失敗");
                        }
                    }
                    break;
                case CallbackCommand.PROGRESS:
                    // クイックフォーマット時は呼び出されない(?)
                    int progress = Marshal.ReadInt32(action);
                    Console.WriteLine("フォーマット進捗率(%): " + progress.ToString());
                    break;
                case CallbackCommand.STRUCTUREPROGRESS:
                    // クイックフォーマット時のみ呼び出される(?)
                    // ただし、進捗は取得できない模様(?)
                    break;
                default:
                    // その他のコマンド
                    break;
            }
            // フォーマットを継続する場合は1、フォーマットキャンセル時は 0 をリターン
            // キャンセルするとファイルフォーマットは破損し、ディスクの再フォーマットが必要となる
            return 1;
        }
        
        // FormatEx 関数の呼び出し
        public void FormatDisk()
        {
            // コールバック関数の設定
            FormatCallBackDelegate callback = new FormatCallBackDelegate(formatCallBack);

            string driveLetter = @"N:";     // ドライブレター
            int32 quick = 1;                // クイックフォーマット(通常フォーマットは 0)
            string volLabel = @"VOL_LABEL"; // ボリュームラベル
            string fs = @"NTFS";            // ファイルシステムフォーマット(NTFS FAT32 EXFAT)
            int32 media = REMOVEABLE_DISK;  // USB などのリムーバルディスク(メディアに応じて要変更)
                                            // クイックフォーマットが失敗するケースあり

            // ディスクのフォーマット
            FormatEx(driveLetter, media, fs, volLabel, quick, 0, callback);
        }
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *