作者qrtt1 (null)
看板C_and_CPP
标题Re: [问题] boost::filesystem 路径问题 (许功盖相关)
时间Mon Aug 10 00:54:45 2009
Hello,
重新测试後发现,其实在 WinXP Big5 环境下,对於许功能等字虽然能正常处理,
但似乎会影响到下一次 iteration 的结果。
我建立的 test_folder 结构如下:
test_folder/
功能总览/
功能总览/a.txt
功能总览/b.txt
另一个资料夹/
a.txt
当我想起你.txt
使用下列程式测试:
================================================ 测试程式 = [START] ========
#include <iostream>
#include <string>
#include "boost/filesystem.hpp"
#include "boost/progress.hpp"
namespace fs = boost::filesystem;
int main(void) {
boost::progress_timer t(std::clog);
fs::recursive_directory_iterator end;
fs::path path("d:\\test_folder");
fs::recursive_directory_iterator iter(path);
while (iter != end) {
fs::path p;
try {
p = *iter;
if (fs::is_directory(p)) {
std::cout << p.directory_string() << " [directory]"
<< std::endl;
}
if (fs::is_regular(p)) {
std::cout << p.file_string() << " [file]" << std::endl;
}
iter++;
} catch (const std::exception & ex) {
std::cerr << ex.what() << std::endl;
break;
}
}
return EXIT_SUCCESS;
}
================================================ 测试程式 = [END] ========
测试结果为:
C:\demo-room-workspace\native.impl>impl
d:\test_folder\a.txt [file]
d:\test_folder\功能总览 [directory]
d:\test_folder\功能总览\a.txt [file]
d:\test_folder\功能总览\b.txt [file]
boost::filesystem::basic_directory_iterator constructor: 系统找不到指定的路径
。:
"d:\test_folder\功另一个资料夹"
0.02 s
显然在前一个路径的「功」,竟然遗留在「另一个资料夹」的前面。
搜寻 boost::filesytem::path 相关的程式码,觉得问题可能出在下面这段 code:
http://pastie.org/577538
=======================================================================
// from boost "libs/filesystem/src/path.cpp"
namespace
{
// std::locale construction can throw (if LC_MESSAGES is wrong, for
example),
// so a static at function scope is used to ensure that exceptions can be
// caught. (A previous version was at namespace scope, so initialization
// occurred before main(), preventing exceptions from being caught.)
std::locale & loc()
{
#if !defined(macintosh) && !defined(__APPLE__) && !defined(__APPLE_CC__)
// ISO C calls this "the locale-specific native environment":
static std::locale lc("");
#else
static std::locale lc = std::locale(); // Mac OS doesn't support
locale("")
#endif
return lc;
}
const std::codecvt<wchar_t, char, std::mbstate_t> *&
converter()
{
static const std::codecvt<wchar_t, char, std::mbstate_t> *
cvtr(
&std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t> >
( loc() ) );
return cvtr;
}
bool locked(false);
} // unnamed namespace
// ========== call converter (in the same file ) ==========
wpath_traits::external_string_type
wpath_traits::to_external( const wpath & ph,
const internal_string_type & src )
{
locked = true;
std::size_t work_size( converter()->max_length() * (src.size()+1) );
boost::scoped_array<char> work( new char[ work_size ] );
std::mbstate_t state = std::mbstate_t(); // perhaps unneeded, but cuts
bug reports
const internal_string_type::value_type * from_next;
external_string_type::value_type * to_next;
if ( converter()->out(
state, src.c_str(), src.c_str()+src.size(), from_next, work.get(),
work.get()+work_size, to_next ) != std::codecvt_base::ok )
boost::throw_exception( boost::filesystem::wfilesystem_error(
"boost::filesystem::wpath::to_external conversion error",
ph, system::error_code( system::posix::invalid_argument,
system::system_category ) ) );
*to_next = '\0';
return external_string_type( work.get() );
}
========================================================================
弟对於 cpp 不太熟悉,想请有经验的版友们给点意见。
虽然我觉得问题出在 converter() 但也可能是错误的判断,
只能期望初步的 trace 能逼近问题些 :D
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.48.9
1F:推 LPH66:我猜一下原因: 删除最近层目录时是搜寻最右边的 \ 再砍掉 08/10 05:41
2F:→ LPH66:所以以此例来说它就以为上一层叫 "d:\test_folder\?" 08/10 05:41
3F:→ LPH66:(那个 ? 是功的前半字) 然後再加 \ 再找下一层 08/10 05:41
4F:→ LPH66:理论上是可以改成各层记下自己这一层的目录名长度来修正 08/10 05:42
5F:→ qrtt1:LPH66 的推测蛮合理的,我想办法验证看看 :) 08/10 09:57
7F:→ ycjcsie:如果改成宽字元版本不知能否解决 08/11 22:04