簡體   English   中英

程序不能正確復制文件

[英]Program doesn't copy files properly

它只是復制文件名的第一個字母,文件類型是 .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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM