バグ:フォルダの作成

Posted: 2012年08月18日

フォルダを作成する際によく書いてしまうバグを紹介します。

プログラムプログラム:

 #include  <stdio.h>
 #include  <Windows.h>

 int main(int argc, char *argv[])
 {
    char *pszDirPath = "C:\aaa\bbb\ccc";

    // フォルダの作成
    if( ::CreateDirectory(pszDirPath, NULL) == 0 ) {
        return -1;
    }

    // 処理

    return 0;
 }

このプログラムにどのようなフォルダ作成関連のバグがあると思いますか?

  • C:\aaaまたは、C:\bbbが存在しない場合は、エラーになりフォルダが作成されない
  • この処理を実行するたびにフォルダの作成を行なっているため、エラーになる

改善版プログラム改善版プログラム:

 #include  <stdio.h>
 #include  <Windows.h>
 #include  <imagehlp.h>

 int main(int argc, char *argv[])
 {
    char *pszDirPath = "C:\aaa\bbb\ccc";
    if (::PathIsDirectory(pszDirPath) == FALSE)
        // フォルダの作成
        if( ::MakeSureDirectoryPathExists(pszDirPath, NULL) == TRUE ) {
            return -1;
        }
    }
    // 処理

    return 0;
 }

解説解説:

PathIsDirectoryでフォルダの存在チェックを行なっています。
その他の存在チェックの確認方法もありますが
Win32 Apiを用いたプログラムのためこのメソッドを採用いたしました。

また今回は、存在した場合作成しない動作にしていますが
毎回削除する場合は、処理後に削除処理を行いますが
念の為、存在チェックは、入れておいたほうが良いと思います。

親フォルダ(C:\aaa\bbb)も作成するAPI

  • MakeSureDirectoryPathExists
  • SHCreateDirectory

が存在します。
それぞれ、別ライブラリーに存在するため
この程度の処理ならば自身で開発したほうがいいかもしれません。

ちなみに、MakeSureDirectoryPathExists関数の引数には、
パスの最後は、「\」で終わる必要があるため
気をつける必要があります。

また、設定ができないフォルダ名をつけたフォルダを指定した場合は、
エラーになりますが
その上のフォルダまでは作成されるため
必要であれば削除をその都度行う必要があります。
「C:\aaa\bbb\dd/dd\ccc\ddd\eee\」
この場合は「C:\aaa\bbb\」までのフォルダが作成されます。(MakeSureDirectoryPathExistsの戻り値はエラー)

カテゴリー: バグ, プログラム | タグ: , , , | コメント無し »

コメント