C++ で realpath() 関数を実装する

Jay Shaw 2023年10月12日
  1. realpath() 関数を C++ で実装する
  2. C++ で realpath() 関数を使用して絶対パスを見つける
  3. C++ で realpath() 関数を使用して、1 行のコマンドを使用して絶対パスを検索する
  4. まとめ
C++ で realpath() 関数を実装する

関数 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 では区切り文字は \ です)。

  1. 拡張子が.cppの任意の Linux ディストリビューションでテキスト エディターを開きます。

  2. プログラムには 5つのインポート ファイルがあります。limits.hPATH_MAX サブ関数を含み、stdio は入出力関数用、stdlibstring は文字列関数用、cerrno はエラー ケース用です。 .

  3. main 関数内で変数が作成されます - サイズが PATH_MAX として設定された char 配列 buffer[]PATH_MAX を使用することは、単に推測するのではなく、パス名を保存するためのより良い方法です。

  4. C++ の realpath() は、ファイル名と解決された名前の 2つのパラメーターを取ります。 解決された名前へのポインターを返します。 それ以外の場合は、エラー フラグが返されます。

    char *path = realpath("test.py", buffer);
    
  5. 解決された名前が C++ の関数 realpath() によって正常に返された場合、変数 buffer 内の値が出力されます。

    if (path) {
      printf("Absolute Path = %s.\n", buffer);
    }
    
  6. realpath() 関数がヌル ポインターを返す場合、プログラムは errno 関数を使用してエラー フラグを立てます。

    char* errStr = strerror(errno);
    

    errno 関数は cerrno ライブラリのメンバー関数です。 数値のエラー コードを返しますが、関数 strerror を使用すると、対応する文字列値 char* errStr = strerror(errno) に変換されます。

  7. perror は、エラー メッセージを stder に出力します。 この関数は、最初に中かっこ内に指定されたテキストを出力し、続いてエラー メッセージを出力します。

    perror("realpath");
    
  8. 最後に、プログラムは 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));}'

コードの機能:

  1. gcc -o realpath は、gcc コンパイラを使用して出力アプリケーション realpath を作成します。
  2. コードには、stdlibstdio の 2つのライブラリ パッケージがあります。
  3. main メソッド内で、整数変数 c とポインター v の 2つの変数が作成されます。
  4. 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() を使用してファイルの絶対パスを導き出すことができます。