私のプログラムは、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;
}