كيفية التحقق مما إذا كان هناك ملف وقابل للقراءة في C ++؟

StackOverflow https://stackoverflow.com/questions/1383617

سؤال

لقد حصلت على 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 يجب أن تعمل من أجلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top