Fstream my_file( "test.txt")がありますが、test.txtが存在するかどうかわかりません。存在する場合、私もそれを読むことができるかどうかを知りたいです。どうやってするか?
Linuxを使用しています
私はおそらく行くでしょう:
ifstream my_file("test.txt");
if (my_file.good())
{
// read away
}
good
メソッドは、ストリームを読み込む準備ができているかどうかをチェックします。
Boost.Filesystem を使用できます。 boost::filesystem::exist
関数。
読み取りアクセス権を確認する方法がわかりません。 Boost.Filesystem も見ることができます。ただし、実際にファイルを読み取ろうとする以外の(ポータブル)方法はないでしょう。
どのオペレーティングシステム/プラットフォームですか?
Linux/Unix/MacOSXでは、 fstat を使用できます。
Windowsでは、 GetFileAttributes を使用できます。
通常、標準のC/C++ IO関数でこれを実行する移植可能な方法はありません。
uNIXを使用している場合は、 access() で読み取り可能かどうかがわかります。ただし、ACLが使用されている場合はより複雑になります。この場合、ifstreamでファイルを開いて読み取りを試みるのが最善です。読み取りできない場合、ACLは読み取りを禁止することがあります。
C++ 11以降では、good()
の代わりに暗黙的な operator bool を使用できます。
ifstream my_file("test.txt");
if (my_file) {
// read away
}
最終的にポスターはLinuxを使用していると言っていましたが、Windowsの PathFileExists()
API呼び出しに言及している人がいないことに驚いています。
Shlwapi.lib
ライブラリとShlwapi.h
ヘッダーファイルを含める必要があります。
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>
関数はBOOL
値を返し、次のように呼び出すことができます。
if( PathFileExists("C:\\path\\to\\your\\file.ext") )
{
// do something
}
C++ 17、クロスプラットフォーム: std::filesystem::exists
および std::filesystem::status
& std::filesystem::perms
:
#include <iostream>
#include <filesystem> // C++17
namespace fs = std::filesystem;
/*! \return True if owner, group and others have read permission,
i.e. at least 0444.
*/
bool IsReadable(const fs::path& p)
{
std::error_code ec; // For noexcept overload usage.
auto perms = fs::status(p, ec).permissions();
if ((perms & fs::perms::owner_read) != fs::perms::none &&
(perms & fs::perms::group_read) != fs::perms::none &&
(perms & fs::perms::others_read) != fs::perms::none
)
{
return true;
}
return false;
}
int main()
{
fs::path filePath("path/to/test.txt");
std::error_code ec; // For noexcept overload usage.
if (fs::exists(filePath, ec) && !ec)
{
if (IsReadable(filePath))
{
std::cout << filePath << " exists and is readable.";
}
}
}
ファイルタイプ も確認することを検討してください。