C_and_CPP 板


LINE

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
6F:→ qrtt1:感谢 LPH66 的推论 http://pastie.org/578534 08/10 23:06
7F:→ ycjcsie:如果改成宽字元版本不知能否解决 08/11 22:04







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP