VC处理文件、目录及相应的目录字符串

介绍

文章简单介绍了两种处理文件及目录的方式,一种为boost::filesystem库,一种是用 Win32平台上Windows Shell中的Path Functions。

和文件系统的交互操作及对文件及目录字符串的处理,是编程活动中普遍碰到的问题。下 面介绍两种不同的方式,借助任意一种都可以大大的加速编程时花在这方面的时间和精力, 而且构建出的应用也更稳固。介绍的比较简单,在实际应用时建议大家根据具体需要查看相 应的帮助文档。

boost库(www.boost.org)中的filesystem是一个相当实用的用以进行文件和目录操作的库 ,而且是可以跨平台的。结构清晰合理,封装的相当严谨好用。对于常用的文件遍历操作是 通过迭代器来完成的,和STL保持一致。而且这部分的类和接口比较少,帮助文档也相当的清 晰。

下面例举一个遍历目录及其子目录查找特定文件的方法(摘自BOOST官方帮助文档)。

bool find_file( const path & dir_path, const std::string & file_name)
{
 if ( !exists( dir_path ) ) return false;
 directory_iterator end_itr; // default construction yields past-the-end
 for ( directory_iterator itr( dir_path ); itr != end_itr; ++itr )
 {
  if ( is_directory( *itr ) )
  {
   if ( find_file( *itr, file_name, path_found ) ) return true;
  }
  else if ( itr->leaf() == file_name )
  {
   return true;
  }
 }
 return false;
}

说明:

1. exists和is_directory是位于boost::filesystem名字空间中的一些方法。filesystem 提供了一个path类,及对这个类进行操作的一些方法,包括判断目录是否存在,文件的拷贝 、移动、删除等等。这些方法的参数都包含path对象。

2. directory_iterator是用于遍历目录的迭代器类,操作很简单。注意缺省构造出的实 例,可以用作遍历结束的标志,就象代码中所示的那样。

3. leaf是path类的成员方法,返回一个目录字串的最末端,可能是目录名,也可能是文 件名。path类定义了很多类似的成员函数。

4. 整个方法采用深度优先的递归算法进行查找。

注意:

在用目录字串构造path对象时,filesystem默认使用unix风格,如果是在windows平台上 用windows风格的目录字串进行构造,注意加上native标志,否则会出现异常。例如:

path mypath("c:\\", native);

其实如果不是要跨平台,在WIN32下还可以选择使用Windows Shell中提供的一簇函数来处 理文件名及路径。这些函数位于Shlwapi.dll中,在Shlwapi.h中申明,在编译选项中注意链 接 Shlwapi.lib文件。具体的函数和用法在MSDN中可以很容易查到,有好几十个,非常的丰 富,基本上你可想到的对目录及文件字符串进行处理的方法这里都可以找到。可以很方便的 处理文件及目录字符串,及URL。缺点是不像boost那样有组织有结构。

这部分在VS2005帮助文档中的位置为:Win32 and COM Development/User Interface/Windows User Experience/Windows Shell/Windows Shell/Shell Reference/Shell Lightweight Utility Functions/Path Functions在其他版本的MSDN中应 该也不难找到。

时间: 2024-09-17 03:59:02

VC处理文件、目录及相应的目录字符串的相关文章

gsoap-vc++ .h文件中只有对应的目录怎么处理

问题描述 vc++ .h文件中只有对应的目录怎么处理 最近gsoap调用openssl来处理加密,下载openssl之后,直接解压缩,在vc的附加目录中包含了openssl的include目录 然后编译程序,提示bio.h报语法错误 bio.h文件的内容是 ../../crypto/bio/bio.h 是一个目录,而在这个目录里面的bio.h,才是真正想要的bio.h文件 想问的就是在VC中,要怎么处理,程序才能够自动识别这是个目录,并且跳转到相应的目录然后自动打开这个bio.h 备注:不能把源

open-VS 调试运行无法创建文件,直接在debug目录运行源程序时文件正常创建,是怎么回事?

问题描述 VS 调试运行无法创建文件,直接在debug目录运行源程序时文件正常创建,是怎么回事? VS 调试运行无法创建文件,直接在debug目录运行源程序时文件正常创建,是怎么回事? 我该了管理员权限运行VS 然后调试运行 文件还是没有创建,我跟踪了open()函数的返回值 为1 正确的,表明函数调用成功,可是我在debug目录下并没有发现文件啊? 是怎么回事? 解决方案 检查下你创建文件的相对路径是什么.如果你直接给文件名,那么调试的时候试图在program files下创建文件,这是不允许

mac 复制文件到/System/Library/Frameworks 目录报错

mac book 中复制文件到/System/Library/Frameworks 目录报错 解决方法: 重启电脑,长按Command+r 打开utility中终端 执行如下命令: csrutil disable reboot 我是什么情况遇到这个问题的呢? 安装高版本的Python时 原先系统已经安装了Python,版本是2.7 我在Python 官网下载了Python 3.5.1 安装完了之后按照网上执行一个shell脚本,老是告诉我没有权限, sudo 了也没有用. 下面是这个脚本: #!

PHP删除指定目录中的所有目录及文件的方法

 这篇文章主要介绍了PHP删除指定目录中的所有目录及文件的方法,通过自定义函数delFile实现递归删除的功能,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了PHP删除指定目录中的所有目录及文件的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

权限问题-access文件提示不能将工作目录更改……验证驱动器有效并且路径字符长度不超过260个

问题描述 access文件提示不能将工作目录更改--验证驱动器有效并且路径字符长度不超过260个 此文件只要放在SYSTEM32下 打开时提示点完确定后提示但是,放在system32上一级 打开没问题 问题:如何在system32正常打开此文件,谢谢 解决方案 system32是系统保护目录,access可能没有权限访问你也一般不能把数据库文件放这里,这里都是放系统重要文件的.你应该放到其他用户目录等 解决方案二: 这个提示信息由误导,应该说的是权限不足.你是不是用的access 2003等古老

阿里云虚拟主机:网站文件上传到哪个目录下?什么是根目录?什么是htdocs目录?

注意,请先到阿里云官网领取幸运券,除了价格上有很多优惠外,还可以参与抽奖.详见:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=2a7uv47d&utm_source=2a7uv47d 本文分别介绍WINDOWS操作系统的空间和UNIX(即LINUX)操作系统的空间: 1.什么是根目录?什么是htdocs目录?(注:linux/unix系统请将网页文件上传到htdocs目录下,windows系统

java-我写的servlet将文件上传到WEB-INF目录下,修改了jsp后文件消失了,急求!

问题描述 我写的servlet将文件上传到WEB-INF目录下,修改了jsp后文件消失了,急求! 解决方案 修改JSP文件后,应该是重新生成了.把上传的路径找在其它地方看看

tomcat部署应用程序,打War包图片会丢失就把图片文件单独保存成一个目录,运行找不到图片

问题描述 tomcat部署应用程序,打War包图片会丢失就把图片文件单独保存成一个目录,运行找不到图片 解决方案 项目可以跑起来,也可以在前台显示操作,但是图片问题没着落啊 希望大神们可以指导下

PHP删除指定目录中的所有目录及文件的方法_php技巧

本文实例讲述了PHP删除指定目录中的所有目录及文件的方法.分享给大家供大家参考.具体实现方法如下: <?php /* * * 删除指定目录中的所有目录及文件(或者指定文件) * 可扩展增加一些选项(如是否删除原目录等) * 删除文件敏感操作谨慎使用 * @param $dir 目录路径 * @param array $file_type指定文件类型 */ function delFile($dir,$file_type='') { if(is_dir($dir)){ $files = scand

Linux 用cp和rsync同步文件时跳过指定目录的方法_Linux

需求是:某测试站点,在某个节点的时候需要同步到正式站点去,但是里面的config目录不能覆盖, 方法一:终端命令行下执行以下命令 cp -R `find /projectA -type d -path /projectA/common/config -prune -o -print | sed 1d ` /projectB/ 方法二: localhost # find projectB/ommon/config | xargs touch 修改目标目录的congfig目录文件的access ti