恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

[MQL5] MQL5/Filesディレクトリにあるものの一覧を表示する関数

「MQL5/Files」ディレクトリにある不要なファイルを削除するために、当該ディレクトリにあるファイルやディレクトリを一覧したいなと思いました。
そこで以下の関数を用意したのですが、再び使うことがありそうなので、ブログ上に残しておくことにしました。


コード

//---------------------------------------------------------------
// MQL5/Filesディレクトリにあるものの一覧を表示する関数
//---------------------------------------------------------------
void DisplayFileAndDirectory()
{
    string foundFileName = "";
    long handle = FileFindFirst("*", foundFileName);

    if(handle == INVALID_HANDLE) 
        printf("ファイルもディレクトリも見つかりませんでした");
    else {
        bool loopNext = true;
        for(int i = 1; loopNext; i++) {
            ResetLastError();
            FileIsExist(foundFileName);      // foundFileNameが無ければエラーが発生
            int errorcode = GetLastError();  // foundFileNameがディレクトリの時、ERR_FILE_IS_DIRECTORYとなる
            string type = errorcode == ERR_FILE_IS_DIRECTORY ? "ディレクトリ" : "ファイル";
            printf("[%d] [%s] %s ", i, type, foundFileName);

            loopNext = FileFindNext(handle, foundFileName);
        }
        FileFindClose(handle);
    }
}


//---------------------------------------------------------------
// MQL5/Filesディレクトリにあるファイル(一覧)を表示する関数
//---------------------------------------------------------------
// [memo] ディレクトリは表示しない
void DisplayFile()
{
    string foundFileName = "";
    long handle = FileFindFirst("*", foundFileName);

    if(handle == INVALID_HANDLE) 
        printf("ファイルもディレクトリも見つかりませんでした");
    else {
        bool loopNext = true;
        for(int i = 0, k = 1; loopNext; i++) {
            ResetLastError();
            FileIsExist(foundFileName);
            int errorcode = GetLastError();

            if(errorcode == ERR_FILE_IS_DIRECTORY) {
                // 次のファイルが存在すればfor文の先頭へ(存在しなければfor文を抜ける)
                if(FileFindNext(handle, foundFileName)) continue;
                else break;
            }
            
            printf("[%d] %s ", k, foundFileName);
            k++;
            loopNext = FileFindNext(handle, foundFileName);
        }
        FileFindClose(handle);
    }
}


continue時の失敗談

失敗したことを1つ書いておくと、DisplayFile関数を作っていた時、深く考えずに

if(errorcode != ERR_FILE_IS_DIRECTORY) continue;

としたら無限ループとなりました。理由はもちろん、for文末尾にある

FileFindNext(handle, foundFileName);

が実行されないからです。そんなわけで次のようにしました。

if(errorcode == ERR_FILE_IS_DIRECTORY) {
    if(FileFindNext(handle, foundFileName)) continue;
    else break;
}