2015-07-31 3 views
-4

Он просто копирует первую букву имени файла, а тип файла - .file вместо реального.Программа не копирует файлы правильно

Программа может быть использована для сортировки и копирования файлов в разные каталоги (годы и кварталы) в соответствии с их LastWriteTime.

void sort(std::string quartal, const char * c_pfad, SYSTEMTIME datum, WIN32_FIND_DATA *wfd_p){ 
      year = datum.wYear; 
      str_year = patch::to_string(year);    // convert 

      year_path = dir + str_year + "\\"; // C:\\Pictures\\2015\\ 

      CreateDirectory(convert(year_path), NULL);        // year-dir 

      quartal_path = year_path + quartal; // C:\\Pictures\\2015\\Erstes Quartal\\ 

      CreateDirectory(convert(quartal_path), NULL);        // quarter-dir 

      ziel = quartal_path + *wfd_p->cFileName; 

      CopyFile(c_pfad, convert(ziel), false); 

} 

void schleife(const char* file){ 
WIN32_FIND_DATA wfd; 
HANDLE fHandle = FindFirstFile(file,&wfd); 


do 
{ 
    // Neither . nor .. (subdirectories) 
    if (!((wfd.cFileName[0]=='.') && ((wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0))) 
    { 
     if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 

       findDirGes = findDirGes.substr (0, findDirGes.size()-1) + wfd.cFileName + "\\*"; 
       schleife(convert(findDirGes));        // no file but directory 

     } 
     else 
     { 
      pfad = findDirGes.substr (0, findDirGes.size()-1) + wfd.cFileName; 



      WIN32_FILE_ATTRIBUTE_DATA dateidaten; 

      GetFileAttributesEx(convert(pfad), GetFileExInfoStandard, &dateidaten); 
      // cprintf("\n %d", dateidaten.ftLastWriteTime); 

      FILETIME test = dateidaten.ftLastWriteTime; 
      // cprintf("\n %d", test); 
      SYSTEMTIME datum; 

      FileTimeToSystemTime(&test, &datum); 


     switch (datum.wMonth){ 
     case 1: 
     case 2: 
     case 3: 
      sort("Erstes Quartal\\", convert(pfad), datum, &wfd); 
      break; 
     case 4: 
     case 5: 
     case 6: 
      sort("Zweites Quartal\\", convert(pfad), datum, &wfd); 
      break; 
     case 7: 
     case 8: 
     case 9: 
      sort("Drittes Quartal\\", convert(pfad), datum, &wfd); 
      break; 
     case 10: 
     case 11: 
     case 12: 
      sort("Viertes Quartal\\", convert(pfad), datum, &wfd); 
      break; 
    } 

     } 
    } 
} 
while (FindNextFile(fHandle,&wfd)); 
FindClose(fHandle); 
} 

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

Благодарим за помощь.

+2

'Вопросы, ищущие отладка помощи («почему не этот код работает?») Должны включать в себя желаемое поведение, конкретную проблему или ошибку и короткий код, необходимый для воспроизведения его в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. « – Jashaszun

+0

Что вы хотите, чтобы я добавил? – Yannik

+0

Точно, что находится в комментарии @ Jashaszun. Самый короткий код, необходимый для его воспроизведения. –

ответ

0

Использование только одной глобальной переменной WIN32_FIND_DATA wfd; для всех рекурсивных вызовов является ошибкой. Используйте отдельную локальную переменную каждый раз, когда вам нужно рекурсивно.

void schleife(const char* file) 
{ 
    WIN32_FIND_DATA wfd; // local variable 
    HANDLE fHandle = FindFirstFile(file, &wfd); 
    do 
    { 
     ... 
     schleife(convert(findDirGes)); // recursive call 
     ... 
    } 
    while (FindNextFile(fHandle, &wfd)); 
    FindClose(fHandle); 
} 
+0

Не могли бы вы показать мне, как это сделать? И напомните, что когда я удаляю строки fHandle = fHandleBef, он не возвращает ошибку, но не работает по желанию (см. Описание). – Yannik

+0

@Yannik см. Редактировать – john

+0

@Yannik Ошибка, которую вы описываете, «она не продолжается с файлами (или каталогами) в каталоге выше» - это точно проблема, вызванная использованием одной глобальной переменной. Когда вы начинаете вторую поиск в подкаталоге, это беспорядок с поиском в первом каталоге, потому что вы повторно используете одну и ту же переменную. Это одна из многих причин не использовать глобальные переменные. – john

Смежные вопросы