c++遍历某个路径下的所有文件(比如txt)

zhiguangcv 2013-02-14 02:04:27
hi,如题,
1.我想在windows下实现(我在linux上实现了,但是用到了一个库,windows下没有);
2.我不想依赖VS之类的,感觉他们也是有些自己独特的库,因为我现在用codeblocks;
3.之前有个人用C++调用cmd的部分命令,一句话就把路径下的所有文件名称写到开一个txt文件,然后通过读取该txt文件来遍历这些文件,我实现了,但觉得还不是我想要的。

用VS实现可以,但保证我在codeblocks下不用VS的编译器也能实现就行了,谢谢啦!!!
...全文
35668 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinlian_152 2014-03-31
  • 打赏
  • 举报
回复
引用 19 楼 hongwenjun 的回复:
FILE* pf_path_file;
// 搜索lp_path目录包括子目录所有文件名,保存到输出out_file_name
int find_path_save_file(const char* lp_path , const char* out_file_name)
{
    pf_path_file = fopen(out_file_name, "w");
    int cnt = find_path(lp_path);
    fclose(pf_path_file);
    return cnt;
}

// 遍历搜索目录
int find_path(const char* lp_path)
{
    static int cnt = 0;
    HANDLE hFile;  // windows对文件的操作首先要得到一个文件句柄
    FILETIME ft;  SYSTEMTIME st; // 文件时间 和 系统时间
    WIN32_FIND_DATAA wfd;  // WIN32_FIND_DATAA 是windows定义的查找文件的结构
    char sz_path[MAX_PATH] = {0};
    char buf[MAX_PATH * 2 ] = {0};
    strcpy(sz_path, lp_path);
    strcat(sz_path, "\\*.*");
    hFile = FindFirstFile(sz_path, &wfd);  // FindFirstFile函数查找一个文件,sz_path是要查找的文件名,可以是全路径或相对路径,也可以写通配符,如“c:/*.*”

    if (hFile != INVALID_HANDLE_VALUE) {
        while (FindNextFile(hFile, &wfd)) {  // 利用第一次找到的文件句柄,继续寻找下个文件,如果找到下个文件,则函数填充wfd结构,并返回true
            if (wfd.cFileName[0] == '.') continue; // . 当前目录 .. 上级目录符号  跳过去

            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 判断,得出找到的文件名是否是一个文件夹,如果是,则递归调用查找函数,由此实现深度全文件夹搜索
                strcpy(sz_path, lp_path);
                strcat(sz_path, "\\");
                strcat(sz_path, wfd.cFileName);
                find_path(sz_path);   // 调用递归查找

            } else {
                ft = wfd.ftLastWriteTime;
                FileTimeToSystemTime(&ft, &st);

                sprintf(buf , "%d-%02d-%02d  %02d:%02d  %10u | ", st.wYear, st.wMonth, st.wDay, st.wHour + 8, st.wMinute , wfd.nFileSizeLow); //
                sprintf(buf + 32, "%s | %s", wfd.cFileName , lp_path);

                fprintf(pf_path_file , "%s\n" , buf);    ++cnt;   // 保存记录out_file_name , 返回保存的记录数
            }
        }
    }
    return cnt;
}
怎么没findclose
hongwenjun 2013-02-19
  • 打赏
  • 举报
回复
引用 20 楼 giantchen547792075 的回复:
,路过的,楼上的没有用开发库???
只使用 WINAPI, Windows下 应该都可以适用吧
一码超神 2013-02-18
  • 打赏
  • 举报
回复
,路过的,楼上的没有用开发库???
hongwenjun 2013-02-18
  • 打赏
  • 举报
回复
FILE* pf_path_file;
// 搜索lp_path目录包括子目录所有文件名,保存到输出out_file_name
int find_path_save_file(const char* lp_path , const char* out_file_name)
{
    pf_path_file = fopen(out_file_name, "w");
    int cnt = find_path(lp_path);
    fclose(pf_path_file);
    return cnt;
}

// 遍历搜索目录
int find_path(const char* lp_path)
{
    static int cnt = 0;
    HANDLE hFile;  // windows对文件的操作首先要得到一个文件句柄
    FILETIME ft;  SYSTEMTIME st; // 文件时间 和 系统时间
    WIN32_FIND_DATAA wfd;  // WIN32_FIND_DATAA 是windows定义的查找文件的结构
    char sz_path[MAX_PATH] = {0};
    char buf[MAX_PATH * 2 ] = {0};
    strcpy(sz_path, lp_path);
    strcat(sz_path, "\\*.*");
    hFile = FindFirstFile(sz_path, &wfd);  // FindFirstFile函数查找一个文件,sz_path是要查找的文件名,可以是全路径或相对路径,也可以写通配符,如“c:/*.*”

    if (hFile != INVALID_HANDLE_VALUE) {
        while (FindNextFile(hFile, &wfd)) {  // 利用第一次找到的文件句柄,继续寻找下个文件,如果找到下个文件,则函数填充wfd结构,并返回true
            if (wfd.cFileName[0] == '.') continue; // . 当前目录 .. 上级目录符号  跳过去

            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 判断,得出找到的文件名是否是一个文件夹,如果是,则递归调用查找函数,由此实现深度全文件夹搜索
                strcpy(sz_path, lp_path);
                strcat(sz_path, "\\");
                strcat(sz_path, wfd.cFileName);
                find_path(sz_path);   // 调用递归查找

            } else {
                ft = wfd.ftLastWriteTime;
                FileTimeToSystemTime(&ft, &st);

                sprintf(buf , "%d-%02d-%02d  %02d:%02d  %10u | ", st.wYear, st.wMonth, st.wDay, st.wHour + 8, st.wMinute , wfd.nFileSizeLow); //
                sprintf(buf + 32, "%s | %s", wfd.cFileName , lp_path);

                fprintf(pf_path_file , "%s\n" , buf);    ++cnt;   // 保存记录out_file_name , 返回保存的记录数
            }
        }
    }
    return cnt;
}
dreamgis 2013-02-17
  • 打赏
  • 举报
回复
有意思,学习一下。。。
  • 打赏
  • 举报
回复
http://blog.csdn.net/infoworld/article/details/8221128
  • 打赏
  • 举报
回复
用Qt也很简单,不过Qt 本身就很庞大。
ayrb13 2013-02-16
  • 打赏
  • 举报
回复
可以使用boost::filesystem中的方法,不过boost有些重量级
dubiousway 2013-02-14
  • 打赏
  • 举报
回复
引用 12 楼 zhiguangcv 的回复:
hi,虽然已经接帖了,但还是想问个问题。假如还用你的这个方法,但是不用遍历(while 或者 for)能得到路径下的文件数量吗? 我看那个结构体里面没有相关的变量。谢谢!
不能
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
引用 9 楼 dubiousway 的回复:
引用 7 楼 zhiguangcv 的回复: 顺便问一下,为什么有些函数要以 “_”开头?看到这些符号,我应该首先想到什么? thanks! C/C++ code ? 1234567891011121314151617181920212223 #include <stdio.h> #include <io.h> int main (void) { ……
hi,虽然已经接帖了,但还是想问个问题。假如还用你的这个方法,但是不用遍历(while 或者 for)能得到路径下的文件数量吗? 我看那个结构体里面没有相关的变量。谢谢!
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
引用 9 楼 dubiousway 的回复:
引用 7 楼 zhiguangcv 的回复: 顺便问一下,为什么有些函数要以 “_”开头?看到这些符号,我应该首先想到什么? thanks! C/C++ code ? 1234567891011121314151617181920212223 #include <stdio.h> #include <io.h> int main (void) { ……
hi,运行了一下,正是我想要的。great thanks!
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
子路径下的文件需要遍历么? 如果需要就用dfs或bfs就好了
你好,我暂时不需要哈!谢谢
dubiousway 2013-02-14
  • 打赏
  • 举报
回复
引用 7 楼 zhiguangcv 的回复:
顺便问一下,为什么有些函数要以 “_”开头?看到这些符号,我应该首先想到什么? thanks!

#include <stdio.h>
#include <io.h>
 
int main (void)
{
    _finddata_t fileDir;
	char* dir="d:\\temp\\*.*";
    long lfDir;
    
	if((lfDir = _findfirst(dir,&fileDir))==-1l)
        printf("No file is found\n");
    else{
        printf("file list:\n");
        do{
			printf("%s\n",fileDir.name);

        }while( _findnext( lfDir, &fileDir ) == 0 );
    }
    _findclose(lfDir);

    return 0;
}
下划线开头的函数,据说没啥特别意义,就是这些库函数为了防止和用户自定义的函数名字冲突而已。
derekrose 2013-02-14
  • 打赏
  • 举报
回复
子路径下的文件需要遍历么? 如果需要就用dfs或bfs就好了
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
顺便问一下,为什么有些函数要以 “_”开头?看到这些符号,我应该首先想到什么? thanks!
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
hi, 可以写段简单的代码不? thanks!
dubiousway 2013-02-14
  • 打赏
  • 举报
回复
<io.h>头文件, _findfirst _findnext 函数 这个不是 MFC的函数
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
Hi,谢谢。我可能说的不是很准确,但你应该明白我的意思。 你帮我解决的那个递归问题,我能接受,但这个方案,我不是特别能接受。 我google过一些,但几乎一看就是用MFC之类的写的。 我说的那个问题,能够只用标准C\C++提供的库和函数来解决吗?
唯恐天下不乱 2013-02-14
  • 打赏
  • 举报
回复
#1不是依赖MFC或者VS,这个依赖微软提供的库,#1的代码不依赖MFC。 VS只是一个集成环境,包括编译器,编辑器,调试器等。MFC又只是一个封装了的界面库。 你可以用codeblocks引用微软提供的库。 或许就要找一个跨环境的库。 或者你可以到codeblocks上面找一些帮助文档。 或者你可以看windows的文件系统,然后自己按照操作系统更规则,自己编写代码。 如果你不喜欢微软的东西,而codeblocks可以使用boost,那么可以使用boost::filesystem
引用 2 楼 zhiguangcv 的回复:
谢谢,不过一看我感觉就是严重依赖MFC或者VS的。 能写个满足我1,2,3条要求的程序不?谢谢啦!
zhiguangcv 2013-02-14
  • 打赏
  • 举报
回复
谢谢,不过一看我感觉就是严重依赖MFC或者VS的。 能写个满足我1,2,3条要求的程序不?谢谢啦!
加载更多回复(1)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧