Qt は次の関数を使用して、パスまたはファイルが書き込み可能かどうかを判断します。
bool QFileInfo::isWritable() const
win10システムで実際に測定した場合、結果は正確ではありません。トラブルシューティングを続けると、公式ドキュメントでは次のように説明されています。 a) NTFS アクセス許可チェックが有効になっていない場合、Windows での結果には、ファイルが読み取り専用としてマークされているかどうかのみが反映されます。b) NTFS ファイル システムでは、パフォーマンス上の理由から、所有権とアクセス許可のチェックはデフォルトで無効になっています。エラーの理由: NTFS の制限。
NTFS 制限をオンにします。
NTFS ファイル システムでは、パフォーマンス上の理由から、所有権とアクセス許可のチェックはデフォルトで無効になっています。有効にするには、次の行を追加します。
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
// 你的测试代码...
qt_ntfs_permission_lookup++; // turn checking on
qt_ntfs_permission_lookup--; // turn it off again
サンプルコード:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <QFileInfo>
extern Q_CORE_EXPORT int qt_ntfs_permission_lookup;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qt_ntfs_permission_lookup++;
QFileInfo info("C:/Windows/System32");
qDebug() << info.absoluteFilePath();
qDebug() << info.isWritable(); // false
qt_ntfs_permission_lookup--;
return a.exec();
}
方法 3: QTemporaryFile を使用して、ターゲット パスが書き込み可能かどうかを確認する
ターゲットパスが書き込み可能かどうかを判断する場合、QFileInfo の isWritable() は使いにくいですが、通常は、QFile に基づいてターゲットパスに新しい一時ファイルを作成し、ターゲットパスが書き込み可能かどうかを判断することで間接的に判断します。ファイルは正常に作成されました。
このロジックを自分で実装し、ファイルのオープン、クローズ、削除などの一連のプロセスを実行する必要がある場合は、QTemproryFile クラスを使用して同じ目的を達成できます。
bool IsDirWritable(const QString& dir)
{
QTemporaryFile testFile(dir + "\XXXXXX");
return testFile.open();
}
参考記事:
1. Qt は、パス (ディレクトリ) またはファイル (特に NTFS ファイル システム) が書き込み可能かどうかを確認します。
2. Windows で QFileInfo がファイル権限を取得する際のエラーの解決策
Windows でファイル権限を取得する際の QFileInfo エラーの解決策_qfile オープンに失敗しました_Mai Nianbao のブログ - CSDN ブログ
3. Qt を使用してフォルダーが書き込み可能かどうかを確認する方法