你这个代码里有很多问题,比如 change_path 来改变下一个遍历的路径,但没有用引用传参,也就是说,你调用了 change_path 之后, s1 里面的值根本没变化(楼主可以自己写段小代码测试下),建议改为如下: [mw_shl_code=cpp,true]int change_path(string & path, string new_path)[/mw_shl_code] 另外,在 change_path 里面,你想用 s2 的目录名加在 s1 后面,只加上了前面的斜杠,却没有“*.*”与 s2 之间的分隔,建议改为如下: [mw_shl_code=cpp,true]new_path = "\\" + new_path + "\\*.*";[/mw_shl_code] 如果你要加上这个子目录名字,没必要调用 replace 还要计算 s1 的长度,直接用“+”连接两个string对象就行了: [mw_shl_code=cpp,true]path += new_path;[/mw_shl_code] 另外,在你的 find_file 函数里,也有很明显的问题,你的 if 居然是在 _findfirst 返回 -1L 的时候(也就是找不到任何匹配项)去执行 if 里面的语句、进入子目录。 如果你给 _findfirst 传入的第一个参数是一个目录名,例如“C:\\XX\\YY”,只要这目录存在就能被 _findfirst 正常打开,而且它在FileInfo的name里写入的字符串会是“YY”,而不是“YY”下面的目录或文件名,更不会返回 -1L, 你的代码却还要在返回 -1L 的情况下进去挖掘子目录,这个问题是很明显的。