gpt4 book ai didi

c++ - 如何使用 C++ 列出 Windows 目录中的所有 CSV 文件?

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:39 25 4
gpt4 key购买 nike

我对 C++ 有点陌生,我必须列出 Windows 目录中的所有 CSV 文件,我用谷歌搜索,发现有很多方法可以列出目录中的所有文件,并且我提出了以下解决方案:

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 还是使用上述解决方案更好?

我想 FindNextFile 只列出 CSV 文件会更容易,但我不知道该怎么做。

我的导出应该是一个字符串,因为它是读取 CSV 文件的函数的输入。

谢谢大家。

PS: 我不能使用 boost...

最佳答案

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有一个枚举目录中所有字段的例子here您可以对其进行调整。


编辑:扩展 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 和代码页,您可能应该使用第 3 方库。

从 ASCII(std::stringchar*,字符点在 0-127 之间)转换为 unicode(std::wstringwchar_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)变体并使用纯粹的宽或非宽类型(即 char*、字符串、简单文字、cout 或 wchar_t*、wstring、L""文字、wcout)。如果你这样做,你需要使用 WINAPI 函数的特殊功能(即非宽的 FindFirstFileA 和宽的 FindFirstFileW)

关于c++ - 如何使用 C++ 列出 Windows 目录中的所有 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24866553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com