📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の12版が非表示) | |||
| 12行目: | 12行目: | ||
QString strAppDir = QCoreApplication::applicationDirPath(); | QString strAppDir = QCoreApplication::applicationDirPath(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | |||
== QIODevice::Textオプション == | |||
<code>QIODevice::Text</code>を指定する場合、改行コードは自動的にプラットフォームに合わせて変換される。<br> | |||
<br><br> | <br><br> | ||
| 74行目: | 78行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== 文字列の検索 ==== | |||
特定の文字列を検索する場合は、テキストファイルを読み込みながら検索する文字列が各行に含まれているかを確認する。<br> | |||
<br> | |||
以下の例では、各行が"hoge"という文字列と一致するかどうかを確認している。<br> | |||
一致する行が存在する場合、その行を出力して処理を終了して、一致する行が存在しない場合はその旨を出力する。<br> | |||
<syntaxhighlight lang="c++"> | |||
bool SearchString(const QString &filePath, const QString &str) | |||
{ | |||
QFile File(filePath); | |||
if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) { | |||
std::cerr << QString("ファイルのオープンに失敗 : %1").arg(File.errorString()).toStdString() << std::endl; | |||
return false; | |||
} | |||
QTextStream in(&File); | |||
while (!in.atEnd()) { | |||
QString line = in.readLine(); | |||
if (line == str) { | |||
std::cout << QString("%1 が見つかりました").arg(str).toStdString() << std::endl; | |||
File.close(); | |||
return true; | |||
} | |||
} | |||
std::cout << QString("%1 は見つかりませんでした").arg(str).toStdString() << std::endl; | |||
File.close(); | |||
return false; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== バイナリデータの読み込み ==== | ==== バイナリデータの読み込み ==== | ||
バイナリデータを読み込む場合は、<code>QFile</code>クラスの<code>readLine</code>メソッドまたは<code>readAll</code>メソッドを使用する。<br> | バイナリデータを読み込む場合は、<code>QFile</code>クラスの<code>readLine</code>メソッドまたは<code>readAll</code>メソッドを使用する。<br> | ||
| 179行目: | 215行目: | ||
OutStream << str.replace(QChar(0x301C), QChar(0xFF5E)); | OutStream << str.replace(QChar(0x301C), QChar(0xFF5E)); | ||
</syntaxhighlight> | |||
<br> | |||
以下の例では、ファイルの先頭にテキストを追記している。<br> | |||
# まず、既存のファイルの内容を読み込み、その内容をメモリ(<code>QString</code>クラスや<code>QByteArray</code>)に保存する。 | |||
# 次に、追加する内容と元のファイル内容を結合させる。 | |||
# 最後に、新しい内容でファイルを上書きする。 | |||
<syntaxhighlight lang="c++"> | |||
#include <QFile> | |||
#include <QTextStream> | |||
QFile File("/tmp/sample.txt"); | |||
if (!File.open(QIODevice::ReadOnly | QIODevice::Text)) { | |||
std::cerr << QString("Failed to open file for reading.").toStdString() << std::endl; | |||
return -1; | |||
} | |||
// 元のファイル内容を読み込む | |||
QString oldText; | |||
QTextStream in(&File); | |||
oldText = in.readAll(); | |||
File.close(); | |||
// 追加する内容と元のファイル内容を結合させる | |||
QString newText = "hoge" + "\n" + oldText; | |||
// ファイルに新しい内容を書き込む | |||
if (!File.open(QIODevice::WriteOnly | QIODevice::Text)) { | |||
std::cerr << QString("Failed to open file for writing.").toStdString() << std::endl; | |||
return -1; | |||
} | |||
QTextStream out(&File); | |||
out << newText; | |||
File.close(); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
| 234行目: | 304行目: | ||
<br><br> | <br><br> | ||
== | == ファイル情報 == | ||
==== ファイルの存在確認 ==== | |||
ファイルが存在すれば<code>true</code>、存在しなければ<code>false</code>を返す。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include < | #include <QFileInfo> | ||
bool MainWindow::FileExists(const QString &FileName) | |||
{ | { | ||
QFileInfo FileInfo(FileName); | |||
return FileInfo.exists(); | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
また、<code>QFile</code>クラスを使用する場合は、以下のように記述する。<br> | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
if(QFile::exists("<ファイルのパス>")) | |||
{ // ファイルが存在する場合 | |||
{ | |||
} | } | ||
else | |||
{ // ファイルが存在しない場合 | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
==== ファイルタイプの取得 ==== | ==== ファイルタイプの取得 ==== | ||
ファイルタイプの確認において、ファイルは1、ディレクトリは2、その他は0を返す。<br> | ファイルタイプの確認において、ファイルは1、ディレクトリは2、その他は0を返す。<br> | ||
| 581行目: | 424行目: | ||
|} | |} | ||
</center> | </center> | ||
<br><br> | |||
== ファイルの検索 == | |||
==== QDirを使用する ==== | |||
<syntaxhighlight lang="c++"> | |||
QString path = QApplication::applicationDirPath() + "/images/"; | |||
QStringList nameFilters; | |||
nameFilters.append("*.png"); | |||
nameFilters.append("*.jpg"); | |||
QDir dir(path); | |||
QStringList entry = dir.entryList(nameFilters, QDir::Files); | |||
for(QString file : entry) | |||
{ // 検索して見つかったファイル群 | |||
qDebug() << dir.filePath(file); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== QDirIteratorを使用する ==== | |||
<syntaxhighlight lang="c++"> | |||
QString path = QApplication::applicationDirPath() + "/images/"; | |||
QStringList nameFilters; | |||
nameFilters.append("*.png"); | |||
nameFilters.append("*.jpg"); | |||
QDirIterator itDirs(path, nameFilters, QDir::Files); | |||
while(itDirs.hasNext()) | |||
{ | |||
QString file = itDirs.next(); | |||
qDebug() << file; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
| 603行目: | 480行目: | ||
return list; | return list; | ||
} | |||
</syntaxhighlight> | |||
<br> | |||
<u>再帰呼び出しを使用せずに、サブディレクトリまで検索することもできる。</u><br> | |||
<syntaxhighlight lang="c++"> | |||
QString path = QApplication::applicationDirPath() + "/images/"; | |||
QStringList nameFilters; | |||
nameFilters.append("*.png"); | |||
nameFilters.append("*.jpg"); | |||
QDirIterator itDirs(path, nameFilters, QDir::Files, QDirIterator::Subdirectories); | |||
while(itDirs.hasNext()) | |||
{ | |||
QString file = itDirs.next(); | |||
qDebug() << file; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
| 632行目: | 525行目: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== メモリマップファイル == | |||
メモリマップファイルとは、メモリ空間の一部のように直接読み書きできるファイルのことである。<br> | |||
<br> | |||
メモリマップファイルのメリットを以下に示す。<br> | |||
* 高速にアクセスすることが可能である。 | |||
* メモリ内容を書き換えることにより、ファイルの内容を更新できる。 | |||
* 大きなサイズのファイルを扱う場合、使用するメモリ量が少ない。 | |||
<br> | |||
メモリマッピングには、<code>QFileDevice</code>クラスの<code>map</code>メソッドを使用する。<br> | |||
# <code>QFile</code>クラスを使用して、ファイルを作成または開く。 | |||
# <code>map</code>メソッドを使用して、ファイルの内容をメモリにマッピングする。<br>マッピングに成功した場合、ファイルのメモリ空間を<code>unsigned char</code>型の配列として返す。<br>それを介して、ファイルを読み書きすることが可能となる。 | |||
# マッピングした内容を読み書きする。 | |||
# メモリをアンマッピングする。 | |||
<br> | |||
<code>QFile</code>クラスのデストラクタが呼ばれた場合、または、同じインスタンスで新しいファイルを開いた場合は、自動的にアンマッピングされる。<br> | |||
<br> | |||
以下の例では、既存のファイルを開いて10文字目の文字を書き換えている。<br> | |||
<syntaxhighlight lang="c++"> | |||
// ファイルを開く | |||
QFile file("Sample.txt"); | |||
file.open(QFile::ReadWrite); | |||
// ファイルの内容をメモリにマッピング | |||
unsigned char *pMem = file.map(0, file.size()); | |||
// 10文字目を書き換える | |||
pMem[10] = 'A'; | |||
// メモリをアンマッピング | |||
file.unmap(memory); | |||
// ファイルを閉じる | |||
file.close(); | |||
</syntaxhighlight> | |||
<br><br> | |||
== ファイルパス == | |||
==== 絶対パスの検証 ==== | |||
ファイルのパスがファイルシステム上で有効な形式を持っているかどうか (例: 不正な文字、パスの構造がシステムの要件を満たしているか等) を検証する。<br> | |||
<br> | |||
Qtでは、有効なパスが有効かどうかを検証するメソッドは存在しない。<br> | |||
しかし、<code>QFileInfo</code>クラスおよび<code>QDir</code>クラスを使用して間接的にパスの妥当性を検証することができる。<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QFileInfo> | |||
#include <QDir> | |||
// QFileInfoを使ってパスの情報を取得 | |||
QFileInfo FileInfo("/tmp/sample.txt"); | |||
// ファイル名に使用できない文字が含まれているかどうかを確認 | |||
QString fileName = FileInfo.fileName(); | |||
if (fileName.isEmpty() || fileName.contains(QRegExp("[\/\\0]"))) { | |||
// ファイル名に不適切な文字が含まれている場合 | |||
return false; | |||
} | |||
// パスが絶対パスかどうかを確認 (相対パスは不適切とする) | |||
if (!FileInfo.isAbsolute()) { | |||
return false; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 相対パスの確認 ==== | |||
相対パスの場合、基準となるディレクトリからの解決が可能かどうかを確認する。<br> | |||
相対パスは特定のディレクトリを基準として解釈されるため、その基準ディレクトリから相対パスを解決 (絶対パスに変換) することにより、パスが想定通りの形式であるかを検証できる。<br> | |||
<br> | |||
以下の例では、指定された基準ディレクトリ(basePath)から相対パス(relativePath)を解決して絶対パスに変換して、その絶対パスに対してファイル名が適切な形式を持つかどうか等の検証を行っている。<br> | |||
実際のシナリオでは、更に詳細な検証が必要になるが、このように相対パスを絶対パスに変換して検証することになる。<br> | |||
<syntaxhighlight lang="c++"> | |||
#include <QDir> | |||
QString basePath = "<基準ディレクトリ>"; | |||
QString relativePath = "<相対パス>"; | |||
QDir baseDir(basePath); | |||
QString resolvedPath = baseDir.absoluteFilePath(relativePath); | |||
// 解決されたパスを確認 (不正な文字等) | |||
QFileInfo FileInfo(resolvedPath); | |||
QString fileName = FileInfo.fileName(); | |||
if (fileName.isEmpty() || fileName.contains(QRegExp("[\/\\0]"))) { | |||
// ファイル名に不適切な文字が含まれている場合 | |||
return false; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Qt]] | [[カテゴリ:Qt]] | ||