我有一个返回文件夹内容的函数:
void getDir(const char* d, vector<string> & f)
{
FILE* pipe = NULL;
string pCmd = "dir /B /S " + string(d);
char buf[256];
if( NULL == (pipe = _popen(pCmd.c_str(),"rt")))
{
cout<<"[Expletive deleted]"<<endl;
return;
}
while (!feof(pipe))
{
if(fgets(buf,256,pipe) != NULL)
{
f.push_back(string(buf));
}
}
_pclose(pipe);
}
问题是字符串pCMD
应该等于"dir /B /S c:\Users\Tom"
,但在将char转换为字符串后,它会删除像"dir /B /S c:UsersTom"
这样的反斜杠。我试过用这些方法调用函数:
getDir("c:\Users\Tom", files);
getDir("c:/Users/Tom", files);
getDir("c:\\Users\Tom", files);
getDir("c:\\Users\\Tom", files);
但是每次我失败时(向量files
都是空的......)。有人知道我做错了吗?
答案 0 :(得分:2)
设置双反斜杠,因为单反斜杠代表wildchar,因此反斜杠作为一个字符,它应该以另一个反斜杠开头
答案 1 :(得分:0)
谢谢大家的帮助,特别感谢Debasish Jana,你是对的。为了得到反斜杠作为一个字母,我先用另一个反斜杠。但我找到了另一种使用FindFirstFile()FindNextFile()获取文件夹内容的方法,我想与之分享:
std::vector<std::string> getContent(TCHAR *dir, TCHAR *extention){
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
char ch[260];
char defChar;
memset(patter, 0x00, MAX_PATH);
_stprintf_s(patter, extention, dir);
hFind = FindFirstFile(patter, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
printf ("FindFirstFile failed (%d)\n", GetLastError());
//return 1;
}
else
{
do
{
//ignore current and parent directories
if(_tcscmp(FindFileData.cFileName, TEXT("."))==0 || _tcscmp(FindFileData.cFileName, TEXT(".."))==0)
continue;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
//ignore directories
}
else
{
//list the Files
files.resize(files.size()+1);
WideCharToMultiByte(CP_ACP,0,FindFileData.cFileName,-1, ch,260,&defChar, NULL);
files[files.size()-1] = std::string(ch);
//_tprintf (TEXT("%s\n"), FindFileData.cFileName);
}
}
while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
}
return files;
}
以下是调用此函数的方法:
vector<string> ss;
TCHAR *directory = TEXT("D:\\Music");
TCHAR *ext = TEXT("%s\\*.mp3");
ss = getContent(TCHAR *dir, TCHAR *extention)