2017-07-31 5 views
0

ファイルと実際のファイルへのリンクがあります。両方が同じ物理的な場所を参照している場合、どうすれば検出できますか?Qtで2つのファイルエントリが同じ物理ファイルシステムを参照しているかどうかを検出する方法はありますか?

#include <unistd.h> 
#include <sys/stat.h> 
#include <sys/types.h> 

bool isSameFileSystem(QString path1, QString path2) 
{ 
    struct stat stat1, stat2; 
    QFileInfo fi1(path1); 
    QFileInfo fi2(path2); 
    stat(fi1.absoluteDir().absolutePath().toUtf8().constData(), &stat1); 
    stat(fi2.absoluteDir().absolutePath().toUtf8().constData(), &stat2); 
    return stat1.st_dev == stat2.st_dev; 
} 

答えて

2

与えられたファイル仕様がシンボリックリンクの仕様や、実際のファイルシステムオブジェクトであるか否かを検出する方法があります:

bool point2Same(QString path1, QString path2) 
{ 
    QFileInfo fi1(path1); 
    QFileInfo fi2(path2); 

    QString p1, p2; 
    if (fi1.isSymLink()) 
     p1 = fi1.symLinkTarget(); 
    else 
     p1 = fi1.absolutePath(); 

    if (fi2.isSymLink()) 
     p2 = fi2.symLinkTarget(); 
    else 
     p2 = fi2.absolutePath(); 

    return p1 == p2; 
} 
+0

重複したコードを別の機能に移動することもできます。 – vahancho

+0

私はこれが信頼できる解決策ではないと思います。 'isSymLink'のドキュメントでは、実際のシンボリックなNTFSリンクは明示的に言及されていません。そして、たとえシンボリックなNTFSリンクがハードリンクやジャンクション(マウントされたディレクトリ)について扱われても? – bkausbk

+0

さて、http://doc.qt.io/qt-5/qfileinfo.html#isSymLinkによると、Windowsでは.lnkファイルが読み込まれます。 – AlexanderVX

-1

あなたはQFileSystemModelをスキャン、またはおそらくそれをサブクラス化しますか、 ?これは、指定されたルートからファイルシステムを取得し、そのツリーにアクセスするための素早い方法です。&

+0

あなたはQFileSystemModelが何を対象としているか絶対に確認していますか? – AlexanderVX

+0

Lolは質問を読んで、私が今考えていたことを疑問に思っています。 – Mike

関連する問題