5

文字列nameが開いて読み取ることができるファイルを参照しているかどうかを確認したいので、通常のファイルまたはシンボリックリンクにすることができます。

私は最初にこれを使用しました:

std::ifstream in(name.c_str());
if (!in.is_open()) {
  // throw exception!
}

nameただし、ディレクトリ名を参照しても例外はスローされませんでした。

今私はこれを使用しています:

if (!fs::exists(name) || fs::is_directory(name)) {
  // throw exception!
}

ただし、ディレクトリへのシンボリックリンクの場合は (おそらく) スローされません。これについても同じことが言えます。

if (!fs::is_regular_file(name) && !fs::is_symlink(name)) {
  // throw exception!
}

より良い方法はありますか?

4

1 に答える 1

5

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を参照してください。

于 2014-12-31T17:47:55.313 に答える