私のプログラムは、gcc バージョン 4.4.7 でコンパイルされた Linux 環境で実行されています。
realpath()
ファイルパスを「正規化」するために使用しています。フィード先のすべてのディレクトリとファイルのパスはrealpath()
確実に存在します。これはもちろん、realpath()
適切に機能するために不可欠です。
ただし、エラー コード 17、名前、文字列の説明「ファイルが存在します」 realpath()
で失敗することがあります。EEXIST
それは私を困惑させます。もちろんあります、と叫びrealpath()
ます。しかしrealpath()
、私の怒鳴り声には動じません。
http://pubs.opengroup.org/onlinepubs/009695399/functions/realpath.htmlのドキュメントにはrealpath()
、失敗の原因となるエラーがリストされていますが、それらのエラーの 1 つではありません。EEXIST
なぜrealpath()
このように失敗するのですか?
エラーの原因となるディレクトリとファイル パスの例EEXIST
:
- ディレクトリへの絶対パス:
/alpha/bravo/charlie/delta
- ファイルへの絶対パス:
/alpha/bravo/charlie/foo.txt
- ファイルへの相対パス:
../../charlie/foo.txt
- 余分なドットを含むファイルへのパス:
/alpha/bravo/Charlie/./foo.txt
ただし、これらの例は決定的なものではありません。まったく同じパターンを持ち、同じディレクトリにある他のファイルは成功するからです。
EEXIST
どのディレクトリまたはファイルがエラーを引き起こすかについて、韻や理由はないようです。エラーは通常、正規化しようとした最初のファイル パスでのみ発生し、その後のファイル パスでは発生しません。ただし、その最初のファイルを再度正規化しようとするだけでは、その周りをこじ開けることはできません。エラーはそれだけで発生し続けます。
プログラムの抜粋:
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h> // for PATH_MAX
using std;
string PathCanonicalize( string const & path )
{
string result;
char szResult[ PATH_MAX ];
::realpath( path.c_str(), szResult );
if ( errno == EEXIST )
{
// Why?
cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'. Of course the file exists!" << endl;
result = path;
}
else if ( errno )
{
cerr << "realpath: error code " << errno << ", " << ::strerror( errno ) << ": '" << path << "'" << endl;
result = path;
}
else
{
result = szResult;
}
return result;
}