boost::filesystem使用方法,根据路径创建文件夹

  • filesystem库提供了两个头文件,一个是<boost/filesystem.hpp>,这个头文件包括基本的库内容。它提供了对文件系统的重要操作。

    同一时候它定义了一个类path。正如大家所想的。这个是一个可移植的路径表示方法,它是filesystem库的基础。

  • 一个是<boost/filesystem/fstream.hpp>。是对std::fstream的一个补充,使用能够使用类boost::path作为參数。从而使得filesystem库与标准库的关系更亲热。
  • 由于文件系统对于大多数系统来说都是共享的,所以不同的进程能够同一时候操作同一个对象,因此filesysetm不提供这方面的特性保证。

    当然这样的保证也是不可能的。或者至少昂贵的。

  • filesystem在不论什么时候,仅仅要不能完毕对应的任务。它都可能抛出 basic_filesystem_error异常。当然并不是总会抛出异常。由于在库编译的时候能够关闭这个功能。同一时候有两个函数提供了无异常版本号。这是由于在任务不能完毕时并不是是异常。
  • filesystem库的全部内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。在使用boost.filesytem之后,链接时须要加“-lboost_filesystem-mt”选项,由于这个须要额外的链接,并不是一个纯头文件的库。
  • 本文中所用boost库为1_54
    #include<boost/filesystem.hpp> 
    
    {
    	boost::filesystem::path path("/test/test1");   //初始化 
    	boost::filesystem::path old_cpath = boost::filesystem::current_path(); //取得当前程序所在文件夹  
    	boost::filesystem::path parent_path = old_cpath.parent_path();//取old_cpath的上一层父文件夹路径 
    	boost::filesystem::path file_path = old_cpath / "file"; //path支持重载/运算符
    	if(boost::filesystem::exists(file_path))  //推断文件存在性  
    	{  
    		std::string strPath = file_path.string();
    		int x = 1;
    	} 
    	else 
    	{  
    		//文件夹不存在;   
    		boost::filesystem::create_directory(file_path);  //文件夹不存在。创建 
    	}  
    	bool bIsDirectory = boost::filesystem::is_directory(file_path); //推断file_path是否为文件夹
    	boost::filesystem::recursive_directory_iterator beg_iter(file_path);
    	boost::filesystem::recursive_directory_iterator end_iter;
    	for (; beg_iter != end_iter; ++beg_iter)
    	{
    		if (boost::filesystem::is_directory(*beg_iter))
    		{
    			continue;
    		}
    		else
    		{	
    			std::string strPath = beg_iter->path().string();  //遍历出来的文件名称
    			int x=1;
    		}
    	}
    	boost::filesystem::path new_file_path = file_path / "test.txt";
    	if(boost::filesystem::is_regular_file(new_file_path))	//推断是否为普通文件
    	{  
    		UINT sizefile = boost::filesystem::file_size(new_file_path);  //文件大小(字节)
    		int x =1;
    	}   
    	boost::filesystem::remove(new_file_path);//删除文件new_file_path  
    }
    

    //根据文件夹路径创建文件

  • 
    bool MakeFullPathDir(const string& path)
    	{
    		if (path.empty())
    		{
    			return false;
    		}
    
    		size_t uPos = path.find_first_of("/\\");
    		while (uPos != string::npos)
    		{
    			string dir = path.substr(0, uPos + 1);
    			boost::system::error_code ec;
    			boost::filesystem::create_directory(dir, ec);
    
    			uPos = path.find_first_of("/\\", uPos + 1);
    		}
    		boost::system::error_code ec;
    		boost::filesystem::create_directory(path, ec);
    
    		return true;
    	}

     

<think>好的,我现在需要帮助用户解决关于boost::filesystem库中检测文件存在性及区分文件和目录的问题。首先,我得回忆一下boost::filesystem的相关函数,确保自己的记忆准确,同时结合提供的引用内容来验证信息的正确性。 用户的问题有两个部分:一是检查文件是否存在,二是区分文件和目录。根据引用[1],boost::filesystem::path的构造函数不会验证路径的有效性或检查文件是否存在,所以用户不能仅通过创建path对象来判断存在性,必须调用其他函数。 首先,检查文件是否存在。我记得boost::filesystem提供了exists函数,这个函数应该可以检查路径是否存在。需要确认的是,exists函数是否会抛出异常,或者是否需要错误处理。根据引用[3],boost.filesystem有可能会抛出异常,或者使用错误码参数。用户可能需要两种方式的示例:一种是使用try-catch捕获异常,另一种是通过传递错误码参数来避免异常。 接下来是区分文件和目录。这里应该用is_regular_file和is_directory函数。需要注意的是,这些函数也需要检查路径是否存在,否则在路径不存在的情况下调用它们可能会导致错误。因此,正确的步骤应该是先检查exists,然后再判断是文件还是目录。不过,也有可能exists和is_xxx函数可以结合使用,比如直接调用is_regular_file,但需要处理可能抛出的异常,比如当路径不存在时,这些函数会抛出异常吗?根据引用[3],函数可能会抛出异常,所以需要错误处理。 另外,用户可能需要知道如何处理不同操作系统下的路径问题,比如引用[4]提到的Windows和Linux路径差异,但用户的问题主要在于存在性和类型判断,可能不需要涉及路径格式,不过还是需要注意跨平台兼容性。 现在需要组织回答的结构,先介绍检查存在性的方法,再讲如何区分文件和目录,每种情况都给出代码示例,并说明异常处理和错误码的使用方式。同时,引用提供的参考文献来支持回答,比如引用[1]说明path对象不验证存在性,引用[3]说明异常和错误码的处理方式。 可能的步骤: 1. 使用exists函数检查路径是否存在。 2. 使用is_regular_file和is_directory来区分类型。 3. 提供两种错误处理方式:异常捕获和错误码参数。 4. 给出完整的代码示例,包括头文件、命名空间等。 5. 提醒用户注意路径的构造不会自动验证存在性,必须显式检查。 需要确保代码的正确性,比如函数调用的正确语法,命名空间是否正确(boost::filesystem),以及正确处理status函数可能返回的类型。此外,引用[4]中的示例显示路径处理在不同系统下的差异,但这里的问题不涉及路径解析,所以可能不需要特别提及,除非用户在代码中处理不同系统的路径,但问题中没有提到这一点。 最后,生成相关问题,可能需要包括错误处理、跨平台问题、性能考虑等,但根据用户提供的引用,可能的问题可以涉及如何避免异常、不同错误处理方式的比较,或者与其他库(如std::filesystem)的对比。</think>在boost::filesystem中检查文件存在性及区分文件/目录的方法如下: ### 一、检查文件/目录存在性 使用`boost::filesystem::exists()`函数验证路径有效性: ```cpp #include <boost/filesystem.hpp> namespace fs = boost::filesystem; bool checkExists(const fs::path& p) { try { return fs::exists(p); // 返回true表示路径存在 } catch (const fs::filesystem_error& e) { std::cerr << "Error: " << e.what(); return false; } } ``` ### 二、区分文件与目录 通过`is_regular_file()`和`is_directory()`判断类型: ```cpp void checkType(const fs::path& p) { if (!fs::exists(p)) return; fs::file_status s = fs::status(p); if (fs::is_regular_file(s)) { std::cout << "是普通文件"; } else if (fs::is_directory(s)) { std::cout << "是目录"; } } ``` ### 三、错误处理两种方式 1. **异常捕获模式**(默认): ```cpp try { bool exists = fs::exists("test.txt"); } catch (const fs::filesystem_error& e) { // 处理I/O错误 } ``` 2. **错误码模式**(避免异常): ```cpp boost::system::error_code ec; bool exists = fs::exists("test.txt", ec); // 通过输出参数返回错误 if (ec) { // 处理错误码 } ``` > 注意:路径对象`boost::filesystem::path`的构造不会自动验证有效性[^1],必须显式调用存在性检查函数。所有文件操作建议包裹错误处理代码,特别是在处理外部存储设备时[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值