Как перебрать каталог и выполнить задачу для каждого отдельного файла - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть возможность перечислять файлы в данном каталоге, однако я хочу изолировать каждый файл, найденный в каталоге, до того, как он прочитает следующий, чтобы затем что-то с ним сделать (например, изменить его имя).

Мне просто любопытно, как я могу контролировать каталог (чтобы функция не заканчивалась, а перечислял файлы, добавленные в каталог), а также выше, чтобы что-то делать с каждым файлом в порядке их поиска .

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 Ответ

2 голосов
/ 26 апреля 2019

FindFirstFile() и FindNextFile() - это специфичные для Windows методы для выполнения того, что вы хотите ...

В следующей адаптации в этом примере я прокомментировал, где могут работать найденные имена файлов. (то есть имя изменено, открыто / отредактировано и т. д.) Ищите «/// сделайте свою работу здесь ...».

Введите путь к каталогу в командной строке, например 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...