Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用C+;将n个优先文件移动到另一个目录+;(VS)_C++_File_Directory_Console Application_Move - Fatal编程技术网

C++ 如何使用C+;将n个优先文件移动到另一个目录+;(VS)

C++ 如何使用C+;将n个优先文件移动到另一个目录+;(VS),c++,file,directory,console-application,move,C++,File,Directory,Console Application,Move,我的问题与[问题]交叉引用 但我还有一个最大的问题——我的目录包含超过300万个文件。C#with.GetFiles()无法解决我的问题。 我认为,只有用C++我才能做到。 算法 CreateDir“临时”+计数器目录 将FindFirst文件放入源目录 将文件移动到newDir(在步骤1中创建) 增量反压桩 重复步骤2-4,直到FindFirst没有错误(停止程序)或反文件 这是我的密码 `int _tmain(int argc, TCHAR *argv[]) { WIN32_FIND_

我的问题与[问题]交叉引用 但我还有一个最大的问题——我的目录包含超过300万个文件。C#with.GetFiles()无法解决我的问题。 我认为,只有用C++我才能做到。 算法

  • CreateDir“临时”+计数器目录
  • 将FindFirst文件放入源目录
  • 将文件移动到newDir(在步骤1中创建)
  • 增量反压桩
  • 重复步骤2-4,直到FindFirst没有错误(停止程序)或反文件
  • 增量计数器
  • 重复步骤1-6中的所有步骤
  • 目标:将所有文件从src dir(300万)移动到包含100000个文件的几个目标dir中

    请帮助我编码——我不知道C++(VS 2010)< /P> 这是我的密码

    `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;
    }
    
    `int\u tmain(int-argc,TCHAR*argv[])
    {
    WIN32_查找_数据ffd;
    大整数文件大小;
    TCHAR szDir[MAX_PATH];
    TCHAR szNewDir[MAX_PATH];
    TCHAR szNewDirEx[最大路径];
    参数的大小和长度;
    句柄hFind=无效的句柄值;
    DWORD dwError=0;
    DWORD dwFiles=0;
    DWORD dwDirs=0;
    //如果未将目录指定为命令行参数,
    //打印使用。
    如果(argc!=2)
    {
    _tprintf(文本(“\n用法:%s\n”),argv[0]);
    返回(-1);
    }
    //检查输入路径加3是否不长于最大路径。
    //三个字符表示“\*”加上下面附加的NULL。
    字符串长度(argv[1]、最大路径和长度);
    if(参数的长度>(最大路径-3))
    {
    _tprintf(文本(“\n目录路径太长。\n”);
    返回(-1);
    }
    _tprintf(文本(“\n目标目录为%s\n\n”),argv[1]);
    //准备用于FindFile函数的字符串。首先,复制
    //字符串添加到缓冲区,然后将“\*”追加到目录名。
    StringCchCopy(szDir,MAX_PATH,argv[1]);
    StringCchCat(szDir,最大路径,文本(“\\*”);
    StringCchCopy(szNewDir,MAX_PATH,argv[1]);
    StringCchCat(szNewDir,最大路径,文本(\\dir”);
    StringCchCat(szNewDirEx、MAX_PATH、szNewDir);
    //查找目录中的第一个文件。
    hFind=FindFirstFile(szDir和ffd);
    if(无效的句柄值==hFind)
    {
    显示错误框(文本(“FindFirstFile”);
    返回dwError;
    } 
    //列出目录中的所有文件及其相关信息。
    做
    {
    if(ffd.dwFileAttributes和文件属性目录)
    {
    _tprintf(文本(“%s\n”),ffd.cFileName);
    }
    其他的
    {
    如果(dwFiles==0){
    StringCchCat(szNewDirEx,MAX_路径,文本(dwDirs));
    CreateDir(szNewDirEx);//dwDirs-toString
    }
    如果(!MoveFileEx(\uuuuuuuuuuuuuuuuu+ffd.cFileName,szNewDirEx+ffd.cFileName,MOVEFILE\u WRITE\u THROUGH))
    { 
    printf(“MoveFileEx失败,错误为%d\n”,GetLastError());
    返回;
    }否则{
    dwFiles++;
    如果(dwFiles==50000){
    dwDirs++;
    dwFiles=0;
    }
    }
    }
    }
    while(FindFirstFile(hFind和ffd)!=0);
    dwError=GetLastError();
    if(dwError!=错误\u无\u更多\u文件)
    {
    显示错误框(文本(“FindFirstFile”);
    }
    FindClose(hFind);
    返回dwError;
    }
    
    我在任务中找到了解决方案。我将尝试在我的目录中运行此操作,稍后将发布结果


    完成。线程链接中的代码工作正常

    FindFirstFile仅用于第一个文件,然后必须使用FindTextFile。但问题出在哪里呢?我认为,在moveFile之后,需要再次使用FindFirstFile,因为前面的“first”被移动了。