C++ 如何使用C+;将n个优先文件移动到另一个目录+;(VS)
我的问题与[问题]交叉引用 但我还有一个最大的问题——我的目录包含超过300万个文件。C#with.GetFiles()无法解决我的问题。 我认为,只有用C++我才能做到。 算法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_
`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”被移动了。