【Qt】ファイル、フォルダが存在するか否かを正しく判断する方法

3476 ワード

ずっとQtのisFile、isDir、existsのこのいくつの方法に対して混乱を感じて、いったいどれを使うか分からないで、ネット上で資料を探して、このいくつの方法を使ってしかしすべてそれに対して深く研究していないで、テストを経て問題があることを発見して、まず下のテストコードを見てみます
{
    QFileInfo fi("C:/123");                     //     
    qDebug() << fi.isFile();                    // false
    qDebug() << fi.isDir();                     // true
    qDebug() << fi.exists();                    // true
    qDebug() << fi.isRoot();                    // false
    qDebug() << QFile::exists("C:/123");        // true
    qDebug() << QDir("C:/123").exists();        // true

    fi.setFile("C:/ABC");                       //      
    qDebug() << fi.isFile();                    // false
    qDebug() << fi.isDir();                     // false
    qDebug() << fi.exists();                    // false
    qDebug() << fi.isRoot();                    // false
    qDebug() << QFile::exists("C:/ABC");        // false
    qDebug() << QDir("C:/ABC").exists();        // false

    fi.setFile("C:/");                          //       
    qDebug() << fi.isFile();                    // false
    qDebug() << fi.isDir();                     // true
    qDebug() << fi.exists();                    // true
    qDebug() << fi.isRoot();                    // true
    qDebug() << QFile::exists("C:/");           // true
    qDebug() << QDir("C:/").exists();           // true

    fi.setFile("Z:/");                          //        
    qDebug() << fi.isFile();                    // false
    qDebug() << fi.isDir();                     // false
    qDebug() << fi.exists();                    // false
    qDebug() << fi.isRoot();                    // false
    qDebug() << QFile::exists("Z:/");           // false
    qDebug() << QDir("Z:/").exists();           // false

    fi.setFile("C:/123.lnk");                   //                
    qDebug() << fi.isFile();                    // true
    qDebug() << fi.isDir();                     // false
    qDebug() << fi.exists();                    // true
    qDebug() << fi.isRoot();                    // false
    qDebug() << QFile::exists("C:/123.lnk");    // true
    qDebug() << QDir("C:/123.lnk").exists();    // false

    fi.setFile("C:/456.lnk");                   //                
    qDebug() << fi.isFile();                    // false
    qDebug() << fi.isDir();                     // false
    qDebug() << fi.exists();                    // false
    qDebug() << fi.isRoot();                    // false
    qDebug() << QFile::exists("C:/456.lnk");    // false
    qDebug() << QDir("C:/456.lnk").exists();    // false
}

 
混乱を感じやすいのがexists法であり,この方法は汎用的な判断方法であり,このような表現と見なすことができる.
exists() == (isFile() || isDir())
 
これも私が説明したい問題で、ネット上のいくつかの博文の中で提出した判断ファイルやフォルダはexistsの方法で厳密ではありません.例えば、あなたの本意はファイルが存在するかどうかを判断することですが、ファイルは存在しません.ちょうど同名のフォルダがあれば、existsもtrueに戻ります.フォルダも同じです
 
上のコードに基づいてまとめました
ファイルが存在するかどうかを正確に判断する
1.QFileInfo::isFile()メソッド
 
フォルダが存在するか否かを正確に判断する.QFileInfo::isDir()メソッド2.QDIR::exists()メソッドを使用
 
文字列がファイルであるかフォルダパスであるかは不明です.QFileInfo::exists()メソッド2.QFile::exists()メソッドを使用