C++ で realpath() 関数を実装する
-
realpath()
関数を C++ で実装する -
C++ で
realpath()
関数を使用して絶対パスを見つける -
C++ で
realpath()
関数を使用して、1 行のコマンドを使用して絶対パスを検索する - まとめ
関数 realpath()
は、POSIX 1997 および POSIX 2008 で、ディレクトリ内のファイルの絶対パスを見つける関数として最初に文書化されました。
この記事では、C++ での関数 realpath()
の実装について説明します。 システムに実装して、C++ を使用してファイルの絶対パスを見つけることができます。
realpath()
関数を C++ で実装する
C++ での realpath()
の主な用途は、すべてのシンボリック リンクが解決されたときにファイルのパス名を見つけることです。
C++ での realpath()
の実装について説明する前に、知っておく必要があるいくつかの基本的な概念を次に示します。
- シンボリック リンク: シンボリック リンクはターゲット ファイルを指しますが、コンピューターはシンボリック リンクをターゲット ファイルへのリンクではなく、それ自体のファイルとして扱うため、ショートカットとは異なります。 これは、アクセスすると、元のファイルが存在する場所にユーザーを移動するタイプのファイルとして機能し、シンボリック リンクに加えられた変更は元のファイルにも反映されます。
- 絶対パス: ファイルへのパスが
\usr\bin\main
のようにルート ディレクトリまで記述されている場合、それは絶対パスとして知られています。 - 相対パス: 現在の作業ディレクトリが
usr\bin
に設定されている場合、絶対パスが/usr/bin/main
であるファイルは、単純に main として参照できます。 たとえば、UNIX コマンド:cp /usr/bin/main /usr/bin/main.bak
とコマンド:cp mailbox mailbox.bak
は、作業ディレクトリが/usr/ast
の場合に同じことを行います。
C++ の関数 realpath()
によって検出されるパス名は、指定された値が相対名である場合、必ずしも絶対的ではありませんが、リンク値の絶対名でシンボリック リンクがトラバースされるかどうかにも依存します。 存在する場合、出力は絶対名です。
C++ で realpath()
関数を使用して絶対パスを見つける
C++ で realpath()
を使用してファイルの絶対パスを見つけるプログラムを作成してみましょう。 この例は Linux で示されています (Windows では区切り文字は \
です)。
-
拡張子が
.cpp
の任意の Linux ディストリビューションでテキスト エディターを開きます。 -
プログラムには 5つのインポート ファイルがあります。
limits.h
はPATH_MAX
サブ関数を含み、stdio
は入出力関数用、stdlib
、string
は文字列関数用、cerrno
はエラー ケース用です。 . -
main
関数内で変数が作成されます - サイズがPATH_MAX
として設定された char 配列buffer[]
。PATH_MAX
を使用することは、単に推測するのではなく、パス名を保存するためのより良い方法です。 -
C++ の
realpath()
は、ファイル名と解決された名前の 2つのパラメーターを取ります。 解決された名前へのポインターを返します。 それ以外の場合は、エラー フラグが返されます。char *path = realpath("test.py", buffer);
-
解決された名前が C++ の関数
realpath()
によって正常に返された場合、変数buffer
内の値が出力されます。if (path) { printf("Absolute Path = %s.\n", buffer); }
-
realpath()
関数がヌル ポインターを返す場合、プログラムはerrno
関数を使用してエラー フラグを立てます。char* errStr = strerror(errno);
errno
関数はcerrno
ライブラリのメンバー関数です。 数値のエラー コードを返しますが、関数strerror
を使用すると、対応する文字列値char* errStr = strerror(errno)
に変換されます。 -
perror
は、エラー メッセージをstder
に出力します。 この関数は、最初に中かっこ内に指定されたテキストを出力し、続いてエラー メッセージを出力します。perror("realpath");
-
最後に、プログラムは
else
ブロック内のEXIT_FAILURE
終了コードを使用して終了します。exit(EXIT_FAILURE);
コード:
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cerrno>
int main(void) {
char buffer[PATH_MAX];
char* path = realpath("test.py", buffer);
if (path) { // or: if (path != NULL)
printf("Absolute Path = %s.\n", buffer);
} else {
char* errStr = strerror(errno);
printf("String Error: %s\n", errStr);
perror("realpath");
exit(EXIT_FAILURE);
}
return 0;
}
コンパイル:
コードは Linux で記述されているため、ターミナルを使用してコンパイルする必要があります。 コードが記述されたテキスト ファイルを適切な名前 (例: C-realpath
) で保存し、拡張子 .cpp
を付けます。
ファイルは gcc
コンパイラを使用してコンパイルされ、コードを実行するための新しいアプリケーションが作成されます。
以下の構文を使用します。
gcc -o realpath2 C-realpath.cpp
上記の構文は、エラーがない限り、コードを正常にコンパイルします。 コンパイルが完了すると、コンパイラはコードの出力アプリケーション realpath2
を作成します。
アプリケーションを実行するには、次の構文を入力します。
./realpath2
出力:
jay@jay-virtual-machine:~$ gcc -o realpath2 C-realpath.cpp
jay@jay-virtual-machine:~$ ./realpath2
Absolute Path = /home/jay/test.py.
ファイル test.py
がシステムに存在するため、プログラムはその絶対パスを出力します。
ファイルに間違った名前が指定された場合、またはファイルが見つからない場合、アプリケーションはエラー コードを出力します。
jay@jay-virtual-machine:~$ ./realpath2
String Error: No such file or directory
realpath: No such file or directory
C++ で realpath()
関数を使用して、1 行のコマンドを使用して絶対パスを検索する
C++ の関数 realpath()
は、Linux の単一行コマンドでも実装できます。 これにより、プログラマーはテキスト ファイルを作成してコードを記述し、それらを個別にコンパイルする必要がなくなります。
コードをコンパイルするには、ターミナル内で次の構文を記述します。
gcc -o realpath -x c - <<< $'#include<stdlib.h>\n#include<stdio.h>\nint main(int c,char**v){puts(realpath(v[1],0));}'
コードの機能:
gcc -o realpath
は、gcc
コンパイラを使用して出力アプリケーションrealpath
を作成します。- コードには、
stdlib
とstdio
の 2つのライブラリ パッケージがあります。 main
メソッド内で、整数変数c
とポインターv
の 2つの変数が作成されます。puts(realpath(v[1],0))
は、realpath()
関数から返された文字列リテラルを返します。
出力を生成するには、出力アプリケーション realpath
にファイル名またはパスを指定する必要があります。 この例では、ファイル システム内のフォルダーがアプリケーションに渡され、ファイルの絶対パスが返されます。
出力:
jay@jay-virtual-machine:~$ ./realpath snap
/home/jay/snap
コード内にエラー例外がないため、入力が見つからないファイルである場合、エラーがスローされます。
jay@jay-virtual-machine:~$ ./realpath vid
Segmentation fault (core dumped)
まとめ
この記事では、C++ で関数 realpath()
を実装して、ファイルの絶対パスを見つける方法について説明します。 この記事を読み終えた読者は、C++ で realpath()
を使用してファイルの絶対パスを導き出すことができます。