2014-10-17 52 views
-1

我的问题crossreferrer与[question] Visual C#: Move multiple files with the same extensions into another directory 但我还没有最大的问题 - 我的目录包含超过300万个文件。 C#与.GetFiles()不能解决我的问题。 我认为,只有用C++我才能做到。 算法如何将n首文件移动到使用C++(VS)的另一个目录

  1. CreateDir “TEMP” + counterDirs
  2. 使用FindFirst文件分成源文件目录
  3. MoveFile成NEWDIR
  4. 增量counterFiles(上1步中创建)
  5. 重复步骤2-4,直到使用FindFirst不有错误(停止编程)或计数器文件< moveLimit(exmpl 100 000)
  6. 增量计数器代码
  7. 重复所有步骤,从1-6

目标:从SRC-DIR(300万美元)将所有文件到几个目标迪尔斯100个000文件。

请帮我的编码 - 我不知道C++(VS 2010)

这是我的代码

`int _tmain(int argc, TCHAR *argv[]) 
{ 
    WIN32_FIND_DATA ffd; 
    LARGE_INTEGER filesize; 
    TCHAR szDir[MAX_PATH]; 
    TCHAR szNewDir[MAX_PATH]; 
    TCHAR szNewDirEx[MAX_PATH]; 
    size_t length_of_arg; 
    HANDLE hFind = INVALID_HANDLE_VALUE; 
    DWORD dwError=0; 
    DWORD dwFiles = 0; 
    DWORD dwDirs = 0; 

    // If the directory is not specified as a command-line argument, 
    // print usage. 

    if(argc != 2) 
    { 
     _tprintf(TEXT("\nUsage: %s <directory name>\n"), argv[0]); 
     return (-1); 
    } 

    // Check that the input path plus 3 is not longer than MAX_PATH. 
    // Three characters are for the "\*" plus NULL appended below. 

    StringCchLength(argv[1], MAX_PATH, &length_of_arg); 

    if (length_of_arg > (MAX_PATH - 3)) 
    { 
     _tprintf(TEXT("\nDirectory path is too long.\n")); 
     return (-1); 
    } 

    _tprintf(TEXT("\nTarget directory is %s\n\n"), argv[1]); 

    // Prepare string for use with FindFile functions. First, copy the 
    // string to a buffer, then append '\*' to the directory name. 

    StringCchCopy(szDir, MAX_PATH, argv[1]); 
    StringCchCat(szDir, MAX_PATH, TEXT("\\*")); 

    StringCchCopy(szNewDir, MAX_PATH, argv[1]); 
    StringCchCat(szNewDir, MAX_PATH, TEXT("\\dir")); 
    StringCchCat(szNewDirEx, MAX_PATH, szNewDir); 
    // Find the first file in the directory. 

    hFind = FindFirstFile(szDir , &ffd); 

    if (INVALID_HANDLE_VALUE == hFind) 
    { 
     DisplayErrorBox(TEXT("FindFirstFile")); 
     return dwError; 
    } 

    // List all the files in the directory with some info about them. 

    do 
    { 
     if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
     _tprintf(TEXT(" %s <DIR>\n"), ffd.cFileName); 
     } 
     else 
     { 
      if(dwFiles == 0) { 
       StringCchCat(szNewDirEx, MAX_PATH, TEXT(dwDirs)); 
       CreateDir(szNewDirEx); //dwDirs toString 
      } 

      if (!MoveFileEx(__OLDDIR__ + ffd.cFileName, szNewDirEx + ffd.cFileName, MOVEFILE_WRITE_THROUGH)) 
      { 
       printf ("MoveFileEx failed with error %d\n", GetLastError()); 
       return; 
      } else { 
       dwFiles++; 
       if (dwFiles == 50000) { 
        dwDirs++; 
        dwFiles = 0; 
       } 

      } 
     } 
    } 
    while (FindFirstFile(hFind, &ffd) != 0); 

    dwError = GetLastError(); 
    if (dwError != ERROR_NO_MORE_FILES) 
    { 
     DisplayErrorBox(TEXT("FindFirstFile")); 
    } 

    FindClose(hFind); 
    return dwError; 
} 
+0

FindFirstFile仅用于第一个文件,那么您必须使用FindNextFile。但问题在哪里? – Tomashu 2014-10-17 10:31:35

+0

我认为,moveFile之后需要再次使用FindFirstFile,因为之前的“第一个”已被移动。 – Toologic 2014-10-17 10:58:05

回答

相关问题