In this article we will discuss different ways to check if given path is of file or directory that exists using Boost Filesystem Library & C++17 Filesystem Library.
Both Boost Filesystem library & C++17 Experimental filesystem library provides certain functions that we are going to use here,Â
bool exists(const path& p);
In Boost Library’s boost::filesystem namespace and In C++17 std::experimental::filesystem namespace,
bool exists(const path& p); bool exists(const path& p, error_code& ec);
Both returns true if the given path points to an entity (file or directory) that exists in filesystem. Also, first one throws filesystem_error, where as overload with error_code& throws nothing.
bool is_regular_file(const path& p);
In Boost Library’s boost::filesystem namespace and In C++17 std::experimental::filesystem namespace,
bool is_regular_file( const path& p ); bool is_regular_file( const path& p, error_code& ec );
Both returns true if the given path points to a regular file. Also, first one throws filesystem_error, where as overload with error_code & throws nothing.
Frequently Asked:
bool is_directory(const path& p);
In Boost Library’s boost::filesystem namespace and In C++17 std::experimental::filesystem namespace,
bool is_directory(const path& p); bool is_directory(const path& p, system::error_code& ec);
Both returns true if the given path points to a directory. Also, first one throws filesystem_error, where as overload with error_code& throws nothing.
Check if given path is a file that exists using Boost FileSystem Library & C++17
Algo is :
- First convert the given string path to filesystem::path object.
- Check if given path exists or not using filesystem::exists() API.
- Check if given path is a regular file using filesystem::is_regular_file() API.
Complete function for is as follows,
/* Check if given string path is of a file */ bool checkIfFIle(std::string filePath) { try { // Create a Path object from given path string filesys::path pathObj(filePath); // Check if path exists and is of a regular file if (filesys::exists(pathObj) && filesys::is_regular_file(pathObj)) return true; } catch (filesys::filesystem_error & e) { std::cerr << e.what() << std::endl; } return false; }
For C++17, use the same function , with following header file and namespace i.e.
#include <experimental/filesystem> namespace filesys = std::experimental::filesystem;
For Boost Library, use the same function , with following header file and namespace i.e.
#include <boost/filesystem.hpp> namespace filesys = boost::filesystem;
Check if given path is a Directory that exists using Boost & C++17 FileSystem Library
Algo is :
- First convert the given string path to boost::filesystem::path object.
- Check if given path exists or not using boost::filesystem::exists() API.
- Check if given path is a directory using boost::filesystem::is_directory() API.
Complete function is as follows,
/* Check if given string path is of a Directory */ bool checkIfDirectory(std::string filePath) { try { // Create a Path object from given path string filesys::path pathObj(filePath); // Check if path exists and is of a directory file if (filesys::exists(pathObj) && filesys::is_directory(pathObj)) return true; } catch (filesys::filesystem_error & e) { std::cerr << e.what() << std::endl; } return false; }
For C++17, use the same function , with following header file and namespace i.e.
#include <experimental/filesystem> namespace filesys = std::experimental::filesystem;
For Boost Library, use the same function , with following header file and namespace i.e.
#include <boost/filesystem.hpp> namespace filesys = boost::filesystem;
Complete example with Boost headers is as follows,
#include <iostream> #include <cassert> #include <boost/filesystem.hpp> namespace filesys = boost::filesystem; /* Check if given string path is of a file */ bool checkIfFIle(std::string filePath) { try { // Create a Path object from given path string filesys::path pathObj(filePath); // Check if path exists and is of a regular file if (filesys::exists(pathObj) && filesys::is_regular_file(pathObj)) return true; } catch (filesys::filesystem_error & e) { std::cerr << e.what() << std::endl; } return false; } /* Check if given string path is of a Directory */ bool checkIfDirectory(std::string filePath) { try { // Create a Path object from given path string filesys::path pathObj(filePath); // Check if path exists and is of a directory file if (filesys::exists(pathObj) && filesys::is_directory(pathObj)) return true; } catch (filesys::filesystem_error & e) { std::cerr << e.what() << std::endl; } return false; } int main() { std::string filePath = "/home/varun/Study/Sample/Sample.cpp"; // Try to check file that actually exists // It should return true bool result = checkIfFIle(filePath); assert(result == true); // Try to check if directory for file path // It should return false, because thats a file. result = checkIfDirectory(filePath); assert(result == false); std::string dirPath = "/home/varun/Study/Sample"; // Try to check directory that actually exists // It should return true result = checkIfDirectory(dirPath); assert(result == true); dirPath = "/home/varun/Study/Sample99"; // Try to check directory that don't exists // It should return false result = checkIfDirectory(dirPath); assert(result == false); // Try to check if file with directory path // It should return false result = checkIfFIle(dirPath); assert(result == false); return 0; }
Compile above example using Boost with following command in linux,
g++ -std=c++11 example.cpp -lboost_filesystem -lboost_system
Pointers in C/C++ [Full Course]
Compile above example in C++17 after changing header file name and namespace, with following command in linux,
g++ -std=c++17 example.cpp -lstdc++fs