2008-11-30 34 views
5

Làm cách nào để đăng ký C++ nếu tệp là tệp thông thường (và không phải là thư mục, đường ống, v.v ...)? Tôi cần một hàm isFile().Làm cách nào để kiểm tra xem tệp có phải là tệp thông thường trong C++ không?

DIR *dp; 
struct dirent *dirp; 

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

Tôi đã thử so sánh dirp-> d_type với (unsigned char) 0x8, nhưng có vẻ như không di động thông qua hệ thống differents.

Trả lời

3

Bạn cần gọi stat (2) trên tệp và sau đó sử dụng macro S_ISREG trên st_mode.

3

Bản thân C++ không xử lý các hệ thống tệp, do đó không có cách nào trong chính ngôn ngữ đó. Ví dụ về nền tảng cụ thể là stat cho * nix (như đã được ghi chú bởi Martin v. Löwis) và GetFileAttributes dành cho Windows.

Ngoài ra, nếu bạn không bị dị ứng với Boost, có khá nhiều nền tảng boost::filesystem.

23

Bạn có thể dùng di động boost::filesystem (C++ tiêu chuẩn thư viện không thể làm điều này cho đến khi giới thiệu gần đây của std::filesystem trong 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; 
    } 
} 
0

Cảm ơn tất cả các bạn đã giúp đỡ, tôi đã đã thử với

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

Và nó hoạt động tốt. =)

0
#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; 
} 
1

Trong C++ 17, bạn có thể sử dụng hệ thống tập tin std :: :: is_regular_file

#include <filesystem> // additional include 

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

Lưu ý rằng phiên bản trước của C++ có thể có nó dưới std :: nghiệm :: hệ thống tập tin (Nguồn: http://en.cppreference.com/w/cpp/filesystem/is_regular_file)

Các vấn đề liên quan