我有点新的C + +,我已经列出所有的CSV文件在Windows目录中,我GOOGLE了,我发现很多方法列出目录中的所有文件,我想出了以下解决scheme:
int listFiles(string addDir, vector<string> &list) { DIR *dir = 0; struct dirent *entrada = 0; int isFile = 32768; dir = opendir(addDir.c_str()); if (dir == 0) { cerr << "Could not open the directory." << endl; exit(1); } while (entrada = readdir(dir)) if (entrada->d_type == isFile) { list.push_back(entrada->d_name); cout << entrada->d_name << endl; } closedir(dir); return 0; }
它使用Windows的dirent.h(我正在使用VS2013),但问题是: – 设置isFile = 32768是否正确? 它会一直在Windows上工作吗? – 如何知道该文件是否为CSV文件?
另一件事,我试图使用windows.h / FindNextFile,但它没有工作。 使用FindNextFile或上述解决scheme更好吗?
我猜FindNextFile会更容易列出CSV文件,但我不知道该怎么做。
我的退出应该是一个string,因为它是读取CSV文件的函数的input。
Tks伙计。
PS:我不能使用提升…
int listFiles(const string& addDir, vector<string> &list, const std::string& _ext) { DIR *dir = 0; struct dirent *entrada = 0; int isFile = 32768; std::string ext("." + _ext); for (string::size_type i = 0; i < ext.length(); ++i) ext[i] = tolower(ext[i]); dir = opendir(addDir.c_str()); if (dir == 0) { cerr << "Could not open the directory." << endl; exit(1); } while (entrada = readdir(dir)) if (entrada->d_type == isFile) { const char *name = entrada->d_name; size_t len = strlen(entrada->d_name); if (len >= ext.length()) { std::string fext(name + len - ext.length()); for (string::size_type i = 0; i < fext.length(); ++i) fext[i] = tolower(fext[i]); if (fext == ext) { list.push_back(entrada->d_name); cout << entrada->d_name << endl; } } } closedir(dir); return 0; } int main() { vector<string> flist; listFiles("c:\\", flist, "csv"); system("PAUSE"); }
如果你想使用FindNextFile,msdn有一个例子来枚举你可以调整的目录中的所有文件。
编辑:扩展在Windows API方法:
argv
的类型是TCHAR*
,意思是char*
或wchar_t*
取决于#ifdef UNICODE
。 这是所有使用字符串参数的Windows API调用所使用的类型。 要创建TCHAR
文字,您可以使用TEXT("text")
。 要创建wchar_t
文字,您可以使用L"text"
。 如果您不想使用TCHAR语义,则可以将main
重新定义为int main(int argc, char* argv)
或int wmain(int argc, wchar_t* arv)
。 这两种类型之间的转换涉及到处理Unicode和代码页,你应该使用第三方库。
从ASCII( std::string
或char*
与char 0-127中的char)转换为unicode( std::wstring
或wchar_t*
是创建std::wstring(std::string.cbegin(), std::string.cend())
。
下面是一个演示如何使用WinAPI函数列出目录中的文件的代码示例:
#include <windows.h> #incldue <string> #include <iostream> #ifdef UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif #ifdef UNICODE std::wostream& tcout = std::wcout; std::wostream& tcerr = std::wcerr; #else std::ostream& tcout = std::cout; std::ostream& tcerr = std::cerr; #endif int listFiles(const tstring& directory, std::vector<tstring> &list, const tstring& extension) { using std::endl; WIN32_FIND_DATA file; HANDLE hListing; int error; tstring query; if (directory.length() > MAX_PATH - 2 - extension.length()) tcerr << "directory name too long" << endl; query = directory + TEXT("*.") + extension; hListing = FindFirstFile(query.c_str(), &file); if (hListing == INVALID_HANDLE_VALUE) { error = GetLastError(); if (error == ERROR_FILE_NOT_FOUND) tcout << "no ." << extension << " files found in directory " << directory << endl; return error; } do { if ((file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) { tcout << file.cFileName << endl; list.push_back(file.cFileName); } } while (FindNextFile(hListing, &file) != 0); error = GetLastError(); if (error == ERROR_NO_MORE_FILES) error = 0; FindClose(hListing); return error; } int _tmain(int argc, TCHAR* argv[]) { std::vector<tstring> files; listFiles(TEXT("C:\\"), files, TEXT("sys")); if (argc > 1) listFiles(argv[1], files, TEXT("csv")); }
如果你想简化它,你可以通过删除所有的T(TCHAR,TEXT(),新定义的tstring,tcout,tcerr)变体,并使用纯粹的宽或非纯的unicode来使应用程序锁定在unicode或完全不知道unicode。 (即char *,string,简单文字,cout或wchar_t *,wstring,L“”文字,wcout)。 如果你这样做,你需要使用WINAPI函数的特殊功能(例如FindFirstFileA用于非广泛的和FindFirstFileW用于广泛的)