【Qt】QFileInfo::size()徹底解説:ファイルサイズ取得の基本と応用
この関数は、QFileInfo
オブジェクトが参照しているファイルのサイズをバイト単位で返します。
戻り値
- ファイルが存在しない場合、または何らかの理由でファイルサイズを取得できない場合は、
0
を返します。 - ファイルが存在し、そのサイズが取得できる場合は、ファイルのサイズ(バイト単位)を
qint64
型で返します。
使用例
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 存在しないファイルの場合
QFileInfo nonExistentFile("non_existent_file.txt");
if (!nonExistentFile.exists()) {
qDebug() << "ファイル 'non_existent_file.txt' は存在しません。";
qDebug() << "サイズ: " << nonExistentFile.size() << "バイト"; // 0 を返す
}
// 存在するファイルの場合(例としてこのC++ファイル自体)
QFileInfo existingFile("main.cpp"); // もしこのコードがmain.cppに書かれているなら
if (existingFile.exists()) {
qDebug() << "ファイル '" << existingFile.fileName() << "' は存在します。";
qDebug() << "サイズ: " << existingFile.size() << "バイト"; // ファイルの実際のサイズを返す
} else {
qDebug() << "ファイル 'main.cpp' が見つかりませんでした。";
}
return a.exec();
}
size()が 0 を返す場合
これは最も一般的な問題の一つです。size()
が 0
を返す主な理由は以下の通りです。
-
巨大なファイルサイズ(32-bitシステムでの問題)
古いQtのバージョンや、32-bitシステムでqint64
以外の型(例えばint
)でsize()
の結果を受け取っている場合、2GBを超えるファイルなどでオーバーフローが発生し、不正な値(負の値や0
)が返されることがあります。- トラブルシューティング
QFileInfo::size()
の戻り値はqint64
型なので、必ずqint64
型の変数で受け取るようにします。qint64
は64ビットの整数型であり、非常に大きなファイルサイズを扱うことができます。- 使用しているQtのバージョンが古い場合は、最新の安定版への更新も検討します。
- トラブルシューティング
-
ファイルが開いている/ロックされている
他のプロセスによってファイルが排他的に開かれている(ロックされている)場合、ファイルサイズの取得に失敗し、0
を返すことがあります。- トラブルシューティング
- ファイルを使用している可能性のある他のアプリケーションを閉じてみます。
- プログラム内で
QFile
などでファイルを開いている場合、適切にclose()
されているか確認します。
- トラブルシューティング
-
ディレクトリを参照している
QFileInfo
オブジェクトがファイルではなくディレクトリを参照している場合、size()
は0
を返します。ディレクトリは「サイズ」という概念を持ちません(厳密にはディレクトリ自体にもファイルシステム上のサイズがありますが、QFileInfo::size()
はそれを示しません)。- トラブルシューティング
QFileInfo::isDir()
を使って、QFileInfo
がディレクトリを参照しているかどうかを確認します。QFileInfo::isFile()
を使って、ファイルであることを明示的に確認します。
- トラブルシューティング
-
ファイルにアクセスできない(権限がない)
ファイルが存在しても、アプリケーションにそのファイルを読み取る権限がない場合、size()
は0
を返すことがあります。- トラブルシューティング
- アプリケーションを実行しているユーザーが、そのファイルに対する読み取り権限を持っていることを確認します。
- ネットワーク共有上のファイルにアクセスしている場合、ネットワークのアクセス権限を確認します。
- トラブルシューティング
-
ファイルが存在しない
最も単純なケースです。指定されたパスにファイルが存在しない場合、QFileInfo
は有効なファイル情報を取得できず、size()
は0
を返します。- トラブルシューティング
QFileInfo::exists()
を使って、size()
を呼び出す前にファイルが存在するかどうかを確認します。- ファイルのパスが正しいか(スペルミス、大文字小文字の区別、絶対パス/相対パスの指定など)を再確認します。
- ファイルシステム上の実際にファイルが存在するかを確認します。
- アプリケーションがファイルへの読み取り権限を持っているか確認します。特にLinuxなどのUNIX系OSでは権限の問題が発生しやすいです。
- トラブルシューティング
シンボリックリンク (ショートカット) のサイズに関する誤解
- 問題
Windowsのショートカット (.lnk
ファイル) やUNIX/Linuxのシンボリックリンクを参照している場合、QFileInfo::size()
はリンク自体ではなく、リンクが指す実際のファイルのサイズを返します。ユーザーが「ショートカットファイルのサイズ」を期待している場合に混乱が生じます。- トラブルシューティング
QFileInfo::isSymLink()
を使って、オブジェクトがシンボリックリンクであるかを確認します。- シンボリックリンク自体のサイズが必要な場合は、
QFile
でシンボリックリンクファイルを開き、QFile::size()
を呼び出すことで取得できる場合があります(ただし、OSやファイルシステムによって挙動が異なる可能性があります)。Windowsの.lnk
ファイルの場合、QFile::size()
でもターゲットのサイズが返されることが報告されています。この場合、ファイルの内容を直接読み込んでサイズを測るなどのより低レベルなアプローチが必要になることがあります。
- トラブルシューティング
パフォーマンスの問題
- 問題
大量のファイルのQFileInfo::size()
をループ内で頻繁に呼び出すと、ファイルシステムへのアクセスがボトルネックとなり、処理が遅くなることがあります。特にネットワークドライブ上のファイルでは顕著です。- トラブルシューティング
QDir::entryInfoList()
を使用して、一度にディレクトリ内のすべてのファイル情報を取得し、そのリストからQFileInfo
オブジェクトを取り出すようにします。これにより、ファイルシステムへのアクセス回数を減らすことができます。- 必要に応じて
QFileInfo::setCaching(true)
を呼び出すことでキャッシュを有効にできますが、QFileInfo
は通常内部的にキャッシュを使用しているため、明示的に呼び出す必要がない場合もあります。ファイルが変更された可能性がある場合は、refresh()
を呼び出して情報を更新することを忘れないでください。 - ファイルのサイズが必要な処理を、バックグラウンドスレッド(
QThreadPool
やQtConcurrent
など)で行うことで、UIの応答性を維持します。
- トラブルシューティング
- 問題
QFileInfo
オブジェクトは、一度ファイル情報を読み込むと、その情報を内部的にキャッシュします。もしファイルが外部で変更された場合(別のアプリケーションがサイズを変更したなど)、QFileInfo::size()
は古いキャッシュされた値を返す可能性があります。- トラブルシューティング
- ファイル情報の更新が必要な場合は、
QFileInfo::refresh()
を呼び出して、最新のファイルシステム情報に更新します。
- ファイル情報の更新が必要な場合は、
- トラブルシューティング
QFileInfo::size()
を使用する際は、以下の点を常に意識することが重要です。
- パフォーマンスへの配慮
大量ファイル処理ではQDir::entryInfoList()
を検討する。 - キャッシュの考慮
必要に応じてrefresh()
で情報を更新する。 - シンボリックリンクの挙動理解
シンボリックリンクの場合はターゲットのサイズが返されることを理解する。 - 権限の確認
ファイルへのアクセス権限があることを確認する。 - 適切な型で受け取る
常にqint64
で戻り値を受け取る。 - ファイルかディレクトリか
QFileInfo::isFile()
またはQFileInfo::isDir()
で種類を確認する。 - ファイルの存在確認
QFileInfo::exists()
で存在を確認する。
基本的なファイルサイズの取得
最も基本的な例です。指定したファイルのサイズをバイト単位で取得します。
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QFile> // テストファイル作成用
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// テストファイルを作成する
// main.cpp と同じディレクトリに "test_file.txt" を作成
QString testFileName = "test_file.txt";
QFile file(testFileName);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
file.write("Hello, QFileInfo::size() example!");
file.close();
qDebug() << testFileName << " を作成しました。";
} else {
qWarning() << testFileName << " の作成に失敗しました。";
}
// QFileInfo オブジェクトを作成
QFileInfo fileInfo(testFileName);
// ファイルが存在するかどうかを確認
if (fileInfo.exists()) {
qDebug() << "ファイル名:" << fileInfo.fileName();
qDebug() << "絶対パス:" << fileInfo.absoluteFilePath();
qDebug() << "ファイルサイズ:" << fileInfo.size() << "バイト";
// キロバイト、メガバイトに変換する例
qDebug() << "ファイルサイズ:" << QString::number(fileInfo.size() / 1024.0, 'f', 2) << "KB";
qDebug() << "ファイルサイズ:" << QString::number(fileInfo.size() / (1024.0 * 1024.0), 'f', 2) << "MB";
} else {
qDebug() << "ファイルが見つかりません:" << testFileName;
}
// 存在しないファイルの例
QFileInfo nonExistentFileInfo("non_existent_file.txt");
if (!nonExistentFileInfo.exists()) {
qDebug() << "\nファイルが見つかりません:" << nonExistentFileInfo.fileName();
qDebug() << "存在しないファイルのサイズ (0を返すはず):" << nonExistentFileInfo.size() << "バイト";
}
return a.exec();
}
解説
- 存在しないファイルの場合、
size()
が0
を返すことも示しています。 - バイト単位の値を、キロバイトやメガバイトに変換する例も示しています。
size()
はqint64
を返すため、大きなファイルサイズも正確に扱えます。QFileInfo
オブジェクトを作成し、exists()
でファイルの存在を確認してからsize()
を呼び出しています。QFile
を使って一時的なテストファイルを作成しています。
ディレクトリのサイズに関する注意点
QFileInfo::size()
はディレクトリに対しては意味のあるファイルサイズを返しません(通常 0
を返します)。ディレクトリ内の全ファイルの合計サイズを計算する例を示します。
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QDir>
// ディレクトリ内の全ファイルの合計サイズを再帰的に計算する関数
qint64 calculateDirectorySize(const QString &dirPath)
{
qint64 totalSize = 0;
QDir dir(dirPath);
// ディレクトリが存在するか確認
if (!dir.exists()) {
qDebug() << "エラー: ディレクトリが見つかりません -" << dirPath;
return 0;
}
QFileInfoList entries = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
for (const QFileInfo &entry : entries) {
if (entry.isFile()) {
totalSize += entry.size();
} else if (entry.isDir()) {
// サブディレクトリの場合は再帰的に呼び出す
totalSize += calculateDirectorySize(entry.absoluteFilePath());
}
}
return totalSize;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// カレントディレクトリの情報を取得
QString currentDirPath = QDir::currentPath();
QFileInfo currentDirInfo(currentDirPath);
qDebug() << "現在のディレクトリ: " << currentDirPath;
// QFileInfo::size() はディレクトリに対して0を返すことを確認
qDebug() << "QFileInfo::size() (ディレクトリ): " << currentDirInfo.size() << "バイト"; // 0 を返すはず
// ディレクトリ内の合計サイズを計算
qint64 totalDirSize = calculateDirectorySize(currentDirPath);
qDebug() << "ディレクトリ内の合計サイズ:" << totalDirSize << "バイト";
return a.exec();
}
解説
- この例で示すように、
QFileInfo::size()
はディレクトリに対しては有効な合計サイズを返さないため、手動で計算する必要があります。 entry.isFile()
とentry.isDir()
を使って、ファイルかディレクトリかを判別しています。QDir::entryInfoList()
を使ってディレクトリ内のエントリ(ファイルとサブディレクトリ)を取得しています。calculateDirectorySize
関数は、再帰的にディレクトリ内のファイルサイズを合計します。
シンボリックリンクのサイズに関する挙動
シンボリックリンク(Windowsのショートカット、Linuxのシンボリックリンクなど)の場合、QFileInfo::size()
はリンク自体ではなく、リンクが指すターゲットファイルのサイズを返します。
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QFile>
#include <QDir> // シンボリックリンク作成用
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString originalFilePath = "original_file.txt";
QString symlinkPath = "symlink_to_original.txt";
// オリジナルファイルを作成
QFile originalFile(originalFilePath);
if (originalFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
originalFile.write("This is the original file content.");
originalFile.close();
qDebug() << originalFilePath << " を作成しました。サイズ:" << QFileInfo(originalFilePath).size() << "バイト";
} else {
qWarning() << originalFilePath << " の作成に失敗しました。";
return 1;
}
// シンボリックリンクを作成
// Windowsではショートカット(.lnk)、Linuxではシンボリックリンクが作成される
if (QFile::link(originalFilePath, symlinkPath)) {
qDebug() << symlinkPath << " (シンボリックリンク) を作成しました。";
} else {
qWarning() << symlinkPath << " (シンボリックリンク) の作成に失敗しました。";
// Linuxで実行権限がない場合など、失敗することがあります
}
// シンボリックリンクのQFileInfo
QFileInfo symlinkInfo(symlinkPath);
if (symlinkInfo.exists()) {
qDebug() << "\nシンボリックリンク名:" << symlinkInfo.fileName();
qDebug() << "シンボリックリンクですか?" << symlinkInfo.isSymLink();
qDebug() << "ターゲットパス:" << symlinkInfo.symLinkTarget();
// ここが重要:シンボリックリンクのサイズはターゲットのサイズを返す
qDebug() << "シンボリックリンクのサイズ (ターゲットのサイズ):" << symlinkInfo.size() << "バイト";
} else {
qDebug() << "\nシンボリックリンクが見つかりません:" << symlinkPath;
}
// おまけ: シンボリックリンク自体の物理的なファイルサイズを取得する試み
// これはOSやファイルシステムによって挙動が異なる可能性があり、
// QFileInfo::size()では直接取得できないことが多い
QFile rawSymlink(symlinkPath);
if (rawSymlink.open(QIODevice::ReadOnly)) {
qDebug() << "QFile::size() (シンボリックリンク自体を直接開いた場合):" << rawSymlink.size() << "バイト";
rawSymlink.close();
} else {
qDebug() << "シンボリックリンク自体を開けませんでした。";
}
return a.exec();
}
解説
QFile::size()
を使ってシンボリックリンク自体を開いてサイズを取得しようと試みていますが、これはOSやファイルシステムによって結果が異なる可能性があり、必ずしもシンボリックリンク自体の物理的なサイズを返しません。多くの場合は、QFileInfo::size()
と同じくターゲットのサイズを返します。QFileInfo::size()
は、symlinkInfo.size()
がオリジナルファイルのサイズを返すことを示しています。symlinkInfo.isSymLink()
でシンボリックリンクであるかを確認し、symlinkInfo.symLinkTarget()
でリンク先のパスを取得しています。QFile::link()
を使ってシンボリックリンクを作成しています。
ファイルが外部から変更された場合、QFileInfo
のキャッシュされた情報を更新するために refresh()
を使用します。
#include <QCoreApplication>
#include <QFileInfo>
#include <QDebug>
#include <QFile>
#include <QThread> // スリープ用
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString fileName = "mutable_file.txt";
QFile file(fileName);
// 最初にファイルを作成し、内容を書き込む
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
file.write("Initial content.");
file.close();
qDebug() << "Initial size:" << QFileInfo(fileName).size() << "バイト";
} else {
qWarning() << "ファイルの作成に失敗しました。";
return 1;
}
QFileInfo fileInfo(fileName);
qDebug() << "QFileInfoオブジェクト作成直後のサイズ:" << fileInfo.size() << "バイト";
// 外部からファイルが変更されたと仮定し、少し待つ
// (実際には別のプロセスでファイルを変更するなどのシミュレーション)
qDebug() << "\nファイルを外部で変更するのを待っています...";
QThread::sleep(2); // 2秒待つ
// ここで、手動で "mutable_file.txt" の内容を変更するか、
// 以下のコードでプログラム的に内容を追加する
// ファイルに内容を追加する
if (file.open(QIODevice::Append | QIODevice::Text)) {
file.write("\nAppended new content.");
file.close();
qDebug() << "ファイルに内容を追加しました。";
} else {
qWarning() << "ファイルの書き込みに失敗しました。";
return 1;
}
// refresh() を呼び出さずにサイズを取得してみる
qDebug() << "refresh()なしでのサイズ (古いキャッシュの可能性):" << fileInfo.size() << "バイト";
// refresh() を呼び出して情報を更新
fileInfo.refresh();
qDebug() << "refresh()呼び出し後のサイズ (最新):" << fileInfo.size() << "バイト";
return a.exec();
}
fileInfo.refresh()
を呼び出すことで、QFileInfo
オブジェクトがファイルシステムから最新の情報を再読み込みし、その後のsize()
呼び出しで最新のファイルサイズが取得されることを示しています。refresh()
を呼び出す前のfileInfo.size()
は古い値(キャッシュされた値)を返す可能性があることを示しています。QThread::sleep()
で少し待機し、この間に「外部でファイルが変更された」という状況をシミュレートします。(実際には別のエディタなどでファイルを変更してみるとより明確に挙動を確認できます。)- ファイルを作成し、初期サイズを取得します。
QFile::size()
これは QFileInfo::size()
の最も直接的な代替方法であり、多くの場合、こちらの方が適していることがあります。
特徴
- パフォーマンス
ファイルを開くというオーバーヘッドはありますが、ファイルが開かれている状態であれば、ファイルシステムへの余計な問い合わせは発生しません。 - エラーハンドリング
ファイルを開く際にエラーが発生した場合(例: ファイルが存在しない、アクセス権がない)、QFile::open()
がfalse
を返し、error()
メソッドで詳細なエラー情報を取得できます。 - 正確性
開いているファイルに対しては、常にその時点での正確なサイズを返します。 - ファイルを開く必要がある
QFile
オブジェクトを介してファイルを開いた後でなければ、size()
を呼び出せません。
使用例
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QFileInfo> // 比較のためにQFileInfoも使用
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString fileName = "my_document.txt";
// テストファイルを作成
QFile testFile(fileName);
if (testFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
testFile.write("This is a test document.");
testFile.close();
qDebug() << "ファイル '" << fileName << "' を作成しました。";
} else {
qWarning() << "ファイルの作成に失敗しました: " << testFile.errorString();
}
// 1. QFile::size() を使用
QFile file(fileName);
if (file.open(QIODevice::ReadOnly)) { // ファイルを開く必要がある
qint64 fileSize = file.size();
qDebug() << "QFile::size(): ファイルサイズ =" << fileSize << "バイト";
file.close(); // 必ず閉じる
} else {
qDebug() << "QFile: ファイルを開けませんでした -" << file.errorString();
}
// 2. QFileInfo::size() との比較
QFileInfo fileInfo(fileName);
if (fileInfo.exists()) {
qint64 fileInfoSize = fileInfo.size();
qDebug() << "QFileInfo::size(): ファイルサイズ =" << fileInfoSize << "バイト";
} else {
qDebug() << "QFileInfo: ファイルが見つかりません。";
}
// 存在しないファイルの場合
QString nonExistentFile = "non_existent.dat";
QFile nonExistentQFile(nonExistentFile);
if (nonExistentQFile.open(QIODevice::ReadOnly)) {
qDebug() << "QFile::size() for non-existent file:" << nonExistentQFile.size(); // ここは実行されないはず
nonExistentQFile.close();
} else {
qDebug() << "QFile: 存在しないファイルは開けません -" << nonExistentQFile.errorString();
qDebug() << "QFile::size() for non-existent file (オープン失敗時):" << nonExistentQFile.size(); // 0 を返す
}
return a.exec();
}
使いどころ
- ファイルオープン時の詳細なエラー情報が必要な場合。
- ファイルが開かれた状態で、その時点の正確なサイズが必要な場合。
- ファイルの内容を読み書きする前など、既にファイルを開く必要がある場合。
POSIX/Windows API (低レベルなシステムコール)
Qt はクロスプラットフォームな抽象化を提供していますが、場合によっては特定のOSのネイティブAPIを直接呼び出すことで、より細かい制御や、Qtの機能では実現できない特殊な情報(非常にまれですが)を得ることができます。
Linux/macOS (POSIX)
struct stat
構造体のst_size
メンバーがファイルサイズ(バイト単位)を格納します。stat()
またはfstat()
関数を使用します。これらはsys/stat.h
に定義されています。
Windows
GetFileSizeEx()
はLARGE_INTEGER
構造体を使用するため、64ビットのファイルサイズを正確に扱えます。GetFileSize()
またはGetFileSizeEx()
関数を使用します。これらはwindows.h
に定義されています。
特徴
- パフォーマンス
Qt の関数も内部的にはこれらの API を呼び出しているため、劇的なパフォーマンス向上は期待できません。しかし、Qtのオーバーヘッドを完全に避けたい場合に検討されます。 - エラーハンドリング
エラーコードを直接処理する必要があります(例:errno
またはGetLastError()
)。 - クロスプラットフォームではない
OSごとに異なるコードを記述する必要があります。 - 最も低レベルな制御
OSが提供する生のファイル情報にアクセスできます。
使用例 (Linux/macOS の stat の例)
#include <QCoreApplication>
#include <QDebug>
#include <QFile> // テストファイル作成用
#ifdef Q_OS_UNIX // LinuxやmacOSの場合
#include <sys/stat.h> // stat() の定義
#include <errno.h> // errno の定義
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString fileName = "native_api_test.txt";
// テストファイルを作成
QFile testFile(fileName);
if (testFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
testFile.write("This file is for native API size test.");
testFile.close();
qDebug() << "ファイル '" << fileName << "' を作成しました。";
} else {
qWarning() << "ファイルの作成に失敗しました: " << testFile.errorString();
}
#ifdef Q_OS_UNIX
struct stat fileStat;
// QString::toLocal8Bit().constData() で C-style 文字列に変換
if (stat(fileName.toLocal8Bit().constData(), &fileStat) == 0) {
qDebug() << "Native API (stat): ファイルサイズ =" << (qint64)fileStat.st_size << "バイト";
} else {
qDebug() << "Native API (stat): ファイル情報を取得できませんでした。エラー: " << strerror(errno);
}
#else
qDebug() << "このプラットフォームではネイティブAPIの例はコンパイルされません。";
#endif
return a.exec();
}
使いどころ
- パフォーマンスが極めてクリティカルな場合(ただし効果は限定的)
Qtの抽象化によるわずかなオーバーヘッドすら許容できない場合。しかし、ほとんどのアプリケーションではQtのAPIで十分です。 - 既存のC/C++コードベースに統合する場合
既存のネイティブAPI呼び出しに依存しているライブラリなどと連携する場合。 - 非常に特殊な要件がある場合
QtのAPIではカバーできないファイルシステム固有の低レベルな情報が必要な場合。
これは QFileInfo::size()
の代替というよりは、QFileInfo::size()
を用いて**ディレクトリの「サイズ」**を計算する一般的な方法です。QFileInfo::size()
自体はディレクトリに対しては意味のある値を返さないため、この方法が代替として使われます。
特徴
- パフォーマンス
大量のファイルや深い階層のディレクトリでは、処理に時間がかかることがあります。 - QDir と QFileInfo の組み合わせ
Qtの提供する高レベルなクラスを組み合わせて、クロスプラットフォームな実装が可能です。 - 再帰的処理
ディレクトリ内のサブディレクトリやファイルも考慮して合計サイズを計算できます。
使用例
(上記「QFileInfo::size() の例」の「2. ディレクトリのサイズに関する注意点」のセクションで示されているため、ここでは省略します。)
- バックアップツールやディスク使用量分析ツールなど、ディレクトリ構造を扱うアプリケーション。
- ユーザーにディレクトリの総容量を表示したい場合。
代替方法 | 特徴 | 使いどころ |
---|---|---|
QFile::size() | ファイルを開く必要がある、開いたファイルに対して正確なサイズ。 | 既にファイルを開いている、または開く必要がある場合。 |
ネイティブAPI (stat, GetFileSizeEx) | 最も低レベル、OS依存、特殊な要件向け。 | 既存のネイティブコードとの統合、極めて特殊なケース。 |
QDir::entryInfoList + QFileInfo::size() | ディレクトリの合計サイズを計算、再帰的。 | ディレクトリの総容量表示、ディスク使用量分析。 |