如何遍历目录并在每个文件上执行任务

时间:2019-04-26 11:36:54

标签: c windows file loops directory

我可以列出给定目录中的文件,但是我想隔离目录中找到的每个文件,然后再读取下一个文件,然后对其进行处理(例如更改其名称)。

我很好奇我如何监视目录(以使函数不会结束,而是列出添加到目录中的文件),以及上述内容以找到文件的顺序对每个文件进行处理

int main(void)
{    
    struct dirent* de;  // Pointer for directory entry 

// opendir() returns a pointer of DIR type.  
DIR* dr = opendir("E:\\Users\\Joe\\Downloads");

if (dr == NULL)  // opendir returns NULL if couldn't open directory 
{
    printf("Could not open current directory");
    return 0;
}

// Refer http://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html 
// for readdir() 
while ((de = readdir(dr)) != NULL)
    printf("%s\n", de->d_name);

closedir(dr);
return 0;
}

如果有任何Windows特定的方法可以做到这一点,我将举一个例子,因为我非常努力地创建自己的例子。 预先谢谢你。

1 个答案:

答案 0 :(得分:2)

FindFirstFile()FindNextFile()是Windows特定的方法,可用来做您想要的...

this example 的以下改编中,我评论了在哪里可以找到找到的文件名。 (即,名称已更改,已打开/已编辑等)。查找“ ///在这里完成工作...”。

在命令行上输入目录路径,例如C:\\dir1\\dir2,这将找到该位置的所有文件。

请注意,此修改删除了一些用于复制和连接字符串的Microsoft无效方法。

#define MAX_PATHNAME_LEN 260

int main(int argc, char *argv[])
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   DWORD dwError;
   char DirSpec[MAX_PATHNAME_LEN];
   size_t length_of_arg;


   // Check for command-line parameter; otherwise, print usage.
   if(argc != 2)
   {
      printf("Usage: Test <dir>\n");
      return 2;
   }

   // Check that the input is not larger than allowed.
   length_of_arg = strlen(argv[1]);
   if (length_of_arg > (MAX_PATHNAME_LEN - 2))
   {
      printf("Input directory is too large.\n");
      return 3;
   }

   printf ("Target directory is %s.\n", argv[1]);

   // Prepare string for use with FindFile functions.  First, 
   // copy the string to a buffer, then append '\*' to the 
   // directory name.
   sprintf(DirSpec, "%s\\*", argv[1]); 

   // Find the first file in the directory.
   hFind = FindFirstFile(DirSpec, &FindFileData);

   if (hFind == INVALID_HANDLE_VALUE) 
   {
      printf ("Invalid file handle. Error is %u.\n", GetLastError());
      return (-1);
   } 
   else
   {
      printf ("First file name is %s.\n", FindFileData.cFileName);  "/// do your work here..."

                        // List all the other files in the directory.
      while (FindNextFile(hFind, &FindFileData) != 0) 
      {
         printf ("Next file name is %s.\n", FindFileData.cFileName); "/// do your work here..." 
      }

      dwError = GetLastError();
      FindClose(hFind);
      if (dwError != ERROR_NO_MORE_FILES) 
      {
         printf ("FindNextFile error. Error is %u.\n", dwError);
         return (-1);
      }
   }

   return (0);
}