程序无法正确复制文件

Program doesn't copy files properly

本文关键字:复制 文件 程序      更新时间:2023-10-16

它只是复制文件名的第一个字母,文件类型为。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);
}

*这个程序的问题是,它遍历你输入的目录中的所有文件,如果它到达另一个目录,它会完美地排序和复制文件,但之后它不会继续处理上面目录中的文件(或目录)。

谢谢你的帮助。

对于所有递归调用只使用一个全局变量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);
}