Boost.Filesystem v3 の時点で、それが通常のファイルであるかどうかを確認することで、既に必要なことが行われています。以下は簡単なコードです。
#include <boost/filesystem.hpp>
#include <iostream>
namespace fs = boost::filesystem;
int main(int argc, char* argv[]) {
if (argc > 1) {
auto status = fs::status(argv[1]);
if (status.type() == fs::regular_file)
std::cout << argv[1] << " is a valid path." << std::endl;
else
std::cout << argv[1] << " is not a valid path." << std::endl;
if (fs::symlink_status(argv[1]).type() == fs::symlink_file)
std::cout << "It is also a symlink." << std::endl;
} else {
std::cerr << "A path must be given." << std::endl;
}
return 0;
}
ここにいくつかの出力があります:
% ./fstest /bin # it is a symlink path
/bin is not a valid path.
It is also a symlink.
% ./fstest /bin/ # it is a symlink path but dereferenced? (trailing /)
/bin/ is not a valid path.
% ./fstest /bin/zsoelim # it is a symlink
/bin/zsoelim is a valid path.
It is also a symlink.
% ./fstest /bin/soelim # it is not a symlink
/bin/soelim is a valid path.
ご覧boost::filesystem::status(path)
のとおり、シンボリックリンク (実際の場所に続く) であるかどうかに関係なく、実際のパスに関する情報を返します。一方、boost::filesystem::symlink_status(path)
ファイル自体がシンボリックリンクかどうかの情報を返します。
詳細については、boost docsを参照してください。