这是我在visual c ++上的代码:
char dir[MAX_PATH]="";
sprintf(dir,"dir %s",cur_dir);//
FILE* cmd_dir=_popen(dir,"wt");
_pclose(cmd_dir);
如果我尝试将cur_dir
设置为"c:\"
或"c:\perl64"
且没有空白,则会有效,并会列出目录中的文件。
但是,如果cur_dir
为c:\program files
,则无效。即使我打开command.exe(windows终端)并输入dir c:\program files
它仍然无法正常工作。
答案 0 :(得分:0)
您需要在引号“”中捕获路径。
sprintf(dir,"dir \"%s\"",cur_dir);
答案 1 :(得分:0)
您需要在引号中将参数包装到dir
,否则底层shell会将空格视为参数分隔符。
sprintf (dir, "dir \"%s\"", cur_dir);
目前"dir %s"
将扩展为dir c:\program files
,这被视为您拥有dir "c:\program" "files"
;即。两个参数,而不是一个。
如果你打开 cmd 并写下面的内容,你应该看到你选择的目录中的文件:
cmd "c:\program files"
注意:使用sprintf
时要小心,如果cur_dir
足够长,则有可能超出dir[MAX_PATH]
的范围。相反,请考虑使用更安全的snprintf
,这需要您指定最大内容长度:snprintf (dir, MAX_PATH, "dir \"%s\"", cur_dir);
注意:此问题标记为[c++]
,但您的代码段没有显示C ++的迹象 - 它看起来像C." C ++的方式这样做"将包括使用std::string
构建您的命令,并使用_popen
致电_popen (your_string.c_str (), "wt")
。