使用 boost 库 c++ 搜索目录和子目录中的文件
我想创建一个应用程序,使用 c++ 的 boost 库搜索目录和子目录中的文件,我也不想遇到 UNICODE 文件(例如名为 arabic 的文件)的麻烦。 那么我该怎么做呢?
更新:
#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
#define BOOST_FILESYSTEM_NO_DEPRECATED
using namespace boost::filesystem;
using namespace std;
bool find_file( const path & dir_path, // in this directory,
const std::string & file_name, // search for this name,
path & path_found ) // placing path here if found
{
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->status()) )
{
if ( find_file( itr->path(), file_name, path_found ) ) return true;
}
else if ( itr->path().filename() == file_name ) // see below
{
path_found = itr->path();
return true;
}
}
return false;
}
int main()
{
path myPath = "C:";
string myFile = ".doc";
path myfound = "c:";
find_file(myPath, myFile, myfound);
}
我也尝试了这段代码,但它不会编译并显示此错误以及很多
undefined reference to `boost::filesystem3::path::filename() const
错误:
X:\mingw\boost\boost_1_47_0\boost\system\error_code.hpp|214|undefined reference to `boost::system::generic_category()'|
I want to create an application that search files in directory and in subdirectory using the boost library for c++ also I don't want to get trouble with UNICODE files like files named arabic .
So how can i do that?
UPDATE:
#include <iostream>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/fstream.hpp>
#define BOOST_FILESYSTEM_NO_DEPRECATED
using namespace boost::filesystem;
using namespace std;
bool find_file( const path & dir_path, // in this directory,
const std::string & file_name, // search for this name,
path & path_found ) // placing path here if found
{
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->status()) )
{
if ( find_file( itr->path(), file_name, path_found ) ) return true;
}
else if ( itr->path().filename() == file_name ) // see below
{
path_found = itr->path();
return true;
}
}
return false;
}
int main()
{
path myPath = "C:";
string myFile = ".doc";
path myfound = "c:";
find_file(myPath, myFile, myfound);
}
I tried also this code but it won't compile it show this error and a lot
undefined reference to `boost::filesystem3::path::filename() const
also:
X:\mingw\boost\boost_1_47_0\boost\system\error_code.hpp|214|undefined reference to `boost::system::generic_category()'|
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须链接 boost_system 和 boost_filesystem 库。如何执行此操作取决于您的编译器/链接器组合;例如,在我的系统上,我必须添加标志
-lboost_system-mt -lboost_filesystem-mt
。一些备注:在 Windows 上,您通常需要
wstring
(或其他“宽字符”对象)来增加使用 Unicode 路径的机会。其次,您可以使用find_if
和recursive_directory_iterator
使代码变得更短:我的示例使用 C++11 功能
auto
和lambda
,它们出现在 GCC 4.6 中。如果您的编译器缺少这些,您可以轻松地用谓词对象替换 lambda,用显式类型说明符替换auto
:另一个不错的变体使用 Boost.Optional 消除了返回值引用:
You have to link against the boost_system and the boost_filesystem libraries. How to do this depends on your compiler/linker combination; for example, on my system I have to add the flags
-lboost_system-mt -lboost_filesystem-mt
.Some remarks: On Windows, you usually want
wstring
(or other "wide character" object) to increase your chance of working with Unicode paths. Second, you can make your code much shorter usingfind_if
andrecursive_directory_iterator
:My example uses the C++11 features
auto
andlambda
, which are present in GCC 4.6. If your compiler lacks these, you can easily replace the lambda by a predicate object and theauto
by an explicit type specifier:Another nice variant gets rid of the return value reference using Boost.Optional: