其中簡述了 boost 的功能,我看到一項 Traverse file system 的功能。
這不正是我想要又常用的功能嗎?
於是搜尋了Google 找到以下網頁
http://stackoverflow.com/questions/2550309/traversing-a-directory
原始碼如下
#include
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
#define foreach BOOST_FOREACHnamespace fs = boost::filesystem;
fs::recursive_directory_iterator it(top), eod;
foreach (fs::path const & p, std::make_pair(it, eod)) {
if (is_directory(p)) {
...
} else if (is_regular_file(p)) {
...
} else if (is_symlink(p)) {
...
}
}
第二種寫法 using namespace boost::filesystem; using namespace std; path Path = "e:\\"; for(recursive_directory_iterator it(Path); it != recursive_directory_iterator(); ++it) { if ( is_directory(*it) ) cout << *it << it.level() << endl; }
然後開啟Visual Studio ,試著去編譯這個 boost 範例
1. 要 add include directory \boost_1_46_1\
2. 之後會出現無法 link libboost_filesystem-vc90-mt-gd-1_46_1.lib
這是因為沒有build boost lib
3. 有些boost library 需要build,使用 cmd prompt, 在 \boost_1_46_1\ 下,執行bootstrap
4. boostrap 會build bjam, 但是此處失敗了 因為include 不到 windows.h (因為Windows SDK 7沒裝完整 )。失敗原因從 bootstrap.log 中可以看出。重新執行Windows SDK setup 把Windows header 裝上,然後執行Windows SDK 下的Configuration Tool 設定好預設的SDK。
5. 設好了 include 後,之後 cannot open input file 'kernel32.lib', 所以 LIB 也要設置正確
6. 最後編譯成功後,會提示你 include 要加入 E:\boost_1_46_1, lib 要加入 E:\boost_1_46_1\stage\lib
7. 編譯過程中會出現一些Warning, 跟 D_SCL_SECURE_NO_DEPRECATE 有關, 詳情請google
(Visual Studio 2005 SP1以後 use _SCL_SECURE_NO_WARNINGS ) Standard C++ Library
_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
_AFX_SECURE_NO_WARNINGS
_ATL_SECURE_NO_WARNINGS
http://connect.microsoft.com/VisualStudio/feedback/details/101151/scl-secure-no-deprecate-is-not-found-by-search
Message: 'Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators''
正確解法要改用 Checked Iterators, and safe functions _s
http://msdn.microsoft.com/en-us/library/aa985872(v=VS.80).aspx