كيف يمكنني معرفة ما إذا كان الملف هو ملف العادية؟

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

  •  11-07-2019
  •  | 
  •  

سؤال

وكيف يمكنني التحقق في C ++ إذا كان الملف هو ملف العادي (وليس دليلا، والأنابيب، الخ)؟ أحتاج إلى isFile وظيفة ().

DIR *dp;
struct dirent *dirp;

while ((dirp = readdir(dp)) != NULL) {
if ( isFile(dirp)) {
     cout << "IS A FILE!" << endl;
i++;
}

ولقد حاولت مقارنة dirp-> d_type مع (الحرف غير الموقعة) 0x8، لكنه لا يبدو المحمولة من خلال نظم بمختلف.

هل كانت مفيدة؟

المحلول

وتحتاج إلى استدعاء الرقم (2) على الملف، ثم استخدام الماكرو S_ISREG على st_mode.

وشيء من هذا القبيل (مقتبس من هذه الإجابة ):

#include <sys/stat.h>

struct stat sb;

if (stat(pathname, &sb) == 0 && S_ISREG(sb.st_mode))
{
    // file exists and it's a regular file
}

نصائح أخرى

ويمكنك استخدام boost::filesystem (المكتبة القياسية C ++ لا يمكن أن يتم هذا حتى الأخذ في الآونة الأخيرة من الأمراض المنقولة جنسيا :: الملفات في C ++ 17):

#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <iostream>

int main() {
    using namespace boost::filesystem;

    path p("/bin/bash");
    if(is_regular_file(p)) {
        std::cout << "exists and is regular file" << std::endl;
    }
}

وC ++ نفسه لا يتعامل مع أنظمة الملفات، لذلك ليس هناك طريقة المحمولة في اللغة نفسها. وstat أمثلة منصة محددة ل* لا شىء (كما سبقت الإشارة إليه من قبل مارتن الخامس. Löwis) وGetFileAttributes ويندوز.

وأيضا، إذا كنت لا حساسية من زيادة أو هناك إلى حد ما عبر منصة boost::filesystem.

في C ++ 17، يمكنك استخدام الأمراض المنقولة جنسيا :: :: الملفات is_regular_file

#include <filesystem> // additional include

if(std::filesystem::is_regular_file(yourFilePathToCheck)) 
    ; //Do what you need to do

لاحظ أن إصدار سابق من C ++ وربما كان ذلك تحت الأمراض المنقولة جنسيا :: التجريبي :: نظام الملفات (المصدر: <لأ href = "http://en.cppreference.com/w/cpp/filesystem/is_regular_file" يختلط = " نوفولو noreferrer "> http://en.cppreference.com/w/cpp/filesystem/is_regular_file )

وشكرا لكم جميعا للمساعدة، لقد حاولت مع

while ((dirp = readdir(dp)) != NULL) { 
   if (!S_ISDIR(dirp->d_type)) { 
        ... 
        i++; 
   } 
} 

وأنه يعمل بشكل جيد. =)

#include <boost/filesystem.hpp>

bool isFile(std::string filepath)
{
    boost::filesystem::path p(filepath);
    if(boost::filesystem::is_regular_file(p)) {
        return true;
    }
    std::cout<<filepath<<" file does not exist and is not a regular file"<<std::endl;
    return false;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top