كيفية التحقق مما إذا كان هناك ملف وقابل للقراءة في C ++؟
سؤال
لقد حصلت على 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 ثم التمكن من() يمكن أن أخبرك إذا كان قابلاً للقراءة. ومع ذلك ، إذا كانت ACL قيد الاستخدام ، فسيصبح الأمر أكثر تعقيدًا ، في هذه الحالة ، من الأفضل فتح الملف باستخدام Ifstream وحاول القراءة .. إذا لم تتمكن من القراءة ، فقد يحظر ACL القراءة.
منذ C ++ 11 ، من الممكن استخدام ضمني مشغل Bool بدلاً من good()
:
ifstream my_file("test.txt");
if (my_file) {
// read away
}
أعلم أن الملصق قال في النهاية إنهم يستخدمون Linux ، لكنني مندهش من عدم ذكر أحد PathFileExists()
دعوة API لنظام التشغيل Windows.
ستحتاج إلى تضمين 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.";
}
}
}
النظر أيضا في التحقق من نوع الملف.
فيما يتعلق باستخدام FSTAT في Windows ، لست متأكدًا مما إذا كان هذا هو ما تريد. من عند مايكروسوفت يجب أن يكون الملف مفتوحًا بالفعل. Stat يجب أن تعمل من أجلك.