バグ:フォルダの移動

Posted: 2012年10月10日

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

プログラムプログラム:

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

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

    // フォルダの削除
    if( ::MoveFile(pszDirPath, pszDirPath) == 0 ) {
        return -1;
    }

    return 0;
 }

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

  • フォルダの移動では、同じドライブでしか移動ができない
  • すでにフォルダが存在する場合、エラーになる

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

 #include  <stdio.h>

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

    if (::MoveFileEx(pszDirPath, pszNewDirPath, MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) == TRUE)
        return -1;
    }

    return 0;
 }

解説解説:

MoveFileEx関数を用いることで問題に対応しています。
MoveFileExでは、移動方法を指定することが可能である

名称 説明
MOVEFILE_COPY_ALLOWED 他のボリュームへファイルを移動するを可能にする
MOVEFILE_CREATE_HARDLINK 予約
MOVEFILE_DELAY_UNTIL_REBOOT 再起動時ファイルを移動します
MOVEFILE_FAIL_IF_NOT_TRACKABLE ショートカットファイルのトラッキング無効
MOVEFILE_REPLACE_EXISTING 上書き処理
MOVEFILE_WRITE_THROUGH 移動が完了するまで処理を返さない

http://msdn.microsoft.com/ja-jp/library/cc429621.aspx
詳細は、MoveFileExの説明をご覧ください

ここでは、別ディレクトリに移動することができないため別の方法を
考える必要があります。
フォルダの移動となると各自で実装する必要があり
フォルダ内をFindFileで走査し一つづつコピーする処理が必要になります。
長くなるためここでは省略させて頂きます。

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

コメント