查找给定路径下的所有文件

本文介绍了一个使用C语言编写的程序,该程序能够遍历指定路径下的所有文件,并将这些文件名保存到一个名为save.txt的文件中。程序利用了Windows API中的FindFirstFile、FindNextFile等函数实现递归目录遍历。

    最近帮朋友做一个程序题目,题目最关键的问题就是查找出给定路径下的所有文件。原以为这种常见的问题应该在网上随便能搜到,事与愿违,搜到的大多不能跑(各种不给力),所以自己就稍微借鉴了前人的代码,作了一些修改,很幸运最终是能用了,嘿嘿。。。

    下面是程序代码:

#include <stddef.h>
#include <stdio.h>
#include <windows.h>
#include <sys/types.h>
#include <sys/stat.h>
FILE *file; /*将遍历出的文件保存到特定的文件,本文采用save.txt*/

/**查找函数*/
void findAllFile(char *pFilePath)
{
     WIN32_FIND_DATA FindFileData;
     HANDLE hFind = INVALID_HANDLE_VALUE;
     char DirSpec[MAX_PATH+1];
     DWORD dwError;

     strncpy(DirSpec, pFilePath, strlen(pFilePath)+1);
     SetCurrentDirectory(pFilePath);
     strncat(DirSpec, "//*.*", 5);

 

     hFind = FindFirstFile(DirSpec, &FindFileData);

 

     if (hFind == INVALID_HANDLE_VALUE)
     {
          printf("invalid file handle.Error is %u/n", GetLastError());
          return;
     }
     else
     {
          if (FindFileData.dwFileAttributes !=FILE_ATTRIBUTE_DIRECTORY)
          {
               char path[MAX_PATH+1];
               strcpy(path, pFilePath);
               strncat(path, "//", 2);
               strcat(path, FindFileData.cFileName);
               printf("%s/n", path);
               fputs(path, file);
               fputs("/n", file);
           }
          else if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
                 && strcmp(FindFileData.cFileName, ".") !=0
                 && strcmp(FindFileData.cFileName, "..") !=0)
           {
               char Dir[MAX_PATH + 1];
               strcpy(Dir, pFilePath);
               strncat(Dir, "//", 2);
               strcat(Dir, FindFileData.cFileName);

               findAllFile(Dir);
            }
  
          while(FindNextFile(hFind, &FindFileData) !=0)
          {
               if (FindFileData.dwFileAttributes !=FILE_ATTRIBUTE_DIRECTORY)
               {
                   char path[MAX_PATH+1];
                   strcpy(path, pFilePath);
                   strncat(path, "//", 2);
                   strcat(path, FindFileData.cFileName);
                   printf("%s/n", path);
                   fputs(path, file);
                   fputs("/n", file);
                }
                else if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY
                           && strcmp(FindFileData.cFileName, ".") !=0
                           && strcmp(FindFileData.cFileName, "..") !=0)
                 {
                     char Dir[MAX_PATH + 1];
                     strcpy(Dir, pFilePath);
                     strncat(Dir, "//", 2);
                     strcat(Dir, FindFileData.cFileName);

                     findAllFile(Dir);
                 }
          }//end while

 

          dwError = GetLastError();
          FindClose(hFind);
          if (dwError !=ERROR_NO_MORE_FILES)
          {
               printf("Find file error.Error is %u/n", GetLastError());
               return;
          } 
      }//end else
 }


/*主函数*/
int main()
{
     file = fopen("save.txt", "w"); /*打开文件*/

 

     char input_path[50]; 
     printf("please enter input_path:/n");
     scanf("%s", &input_path);     /*要查找的路径*/

 

     findAllFile(input_path);   /*执行查找*/

 

     fclose(file);                    /*关闭文件*/

 

     int a;
     scanf("%d", &a);
     return 0;
}

 

运行结果:

输入:D:/test

输出:

D:/test/subtest/subsubtest/test.rar
D:/test/subtest/test3.txt
D:/test/subtest/test4.txt
D:/test/test1.txt
D:/test/test2.txt

 

    程序中最重要的就是了解 WIN32_FIND_DATA结构、FindFirstFile函数、FindNextFile函数和递归思想。这样网上都有很多资料,不再做详细说明。完。

 

### 使用 Qt 查找指定路径下的文件 #### 方法一:遍历当前路径下所有文件 通过 `QDir` 类可以方便地获取并处理目录中的文件列表。下面是一个简单的函数用于查找给定路径下的全部文件: ```cpp QStringList MainWindow::findFile(QString path) { // 初始化 QDir 对象,并设置过滤器只显示文件,按名称排序 QDir dir(path); // 将系统的路径分隔符转换成统一形式 path = dir.fromNativeSeparators(path); // 创建一个空字符串列表存储找到的文件名 QStringList allFile; // 设置仅返回文件项 dir.setFilter(QDir::Files); // 按照名字顺序排列 dir.setSorting(QDir::Name); // 获取该目录下的文件列表 allFile = dir.entryList(); return allFile; } ``` 此方法适用于简单场景,在不需要复杂筛选条件的情况下能够快速获得目标文件夹内的所有文件[^1]。 #### 方法二:查找特定类型的文件 当有更具体的需求时,比如只想得到某一种扩展名的文件,则可以通过 `entryList()` 函数传入第二个参数来限定匹配模式。这里展示了一个例子,它会尝试在一个目录及其子目录内寻找 `.xml` 文件: ```cpp void findXmlFiles() { QFileInfoList fileList = m_pDialogCfg->FindFile("./test", "*.xml"); QFileInfo fileInfo; bool bIsFind = false; foreach(fileInfo, fileList) { if (fileInfo.fileName().compare(specificFileName) == 0) { bIsFind = true; break; } } if (!bIsFind) { qDebug() << "未找到指定文件"; } else { qDebug() << "已成功定位到所需文件:" << specificFileName; } } ``` 这段代码展示了如何利用通配符 `"*.xml"` 来限制搜索范围至 XML 文件,并进一步检查是否存在具有特定名称的目标文件[^2]。 #### 方法三:异步多线程方式扫描带权限保护的路径 对于一些可能涉及访问控制或需要较长时间才能完成的任务来说,采用单独的工作线程来进行文件检索可能是更好的选择。这不仅提高了用户体验,还允许程序继续响应其他操作而不被阻塞。以下是从对话框类中提取的部分接口定义,表明了此类支持启动后台任务以及接收来自工作线程的通知的能力: ```cpp #ifndef DIALOG_H #define DIALOG_H #include <QDialog> #include "filesearchthread.h" namespace Ui { class Dialog; } class Dialog : public QDialog { Q_OBJECT public: explicit Dialog(QWidget *parent = nullptr); ~Dialog(); private slots: void on_pushButton_clicked(); // 用户点击按钮触发事件 void onSearchFinished(); // 当搜索结束时更新UI界面状态 public slots: void onFileFound(const QString &filePath); // 接收发现的新文件通知 private: Ui::Dialog *ui; }; #endif // DIALOG_H ``` 这种方法特别适合于那些可能会因为权限问题而无法立即读取某些位置的情况,同时也提供了良好的交互体验[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值