前言
用C++做一个文件遍历的时候发现,当我遍历C:\Windows\system32文件夹时,获取到的文件数目和实际总是对不上。在通过他人帮助后了解到了重定向这个概念,我百度了一下,下面为粘贴内容。
一、System32与SysWow64
在C:\Windows目录下,存在System32和SysWOW64两个文件夹,而让人迷惑的是:
System32文件夹下存放的是64位DLL
SysWOW64文件夹下存放的是32位DLL
按照文件夹表面意思,System32应该存放32位dll,SysWoW64应该存放64位dll,微软为何要做出如此别扭的存放呢?
这都是为了兼容32位Windows系统造成的。
因为之前的32位机很多代码都是读写文件到System32目录下,而现在出现了64位机,如果按照System32存放32位dll,SysWoW64存放64位dll的方式,势必要修改以前的32位代码中的System32为SysWoW64,为了避免需要修改,干脆就采用了System32存放64位dll,SysWow64存放32位dll的方式。
原文链接:https://blog.csdn.net/GG_SiMiDa/article/details/81328451
现在问题的根源已经找到了,当我的程序在访问system32时,系统将其重定向了,导致获取到的文件数与实际对不上。那么该怎么解决这一问题呢?
二、关闭重定向
在MSDN搜素了一下,发现了几个函数可以关闭/开启重定向(关闭后不开启,可能会导致其他未知问题)。
我用Wow64EnableWow64FsRedirection简单实验了一下,发现确实好用啊!
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <io.h>
#include <string>
#include <Windows.h>
#include <fstream>
#include <stdio.h>
#include <sys/stat.h>
#include <ctime>
using namespace std;
ofstream g_ofStream( "c:/test.txt", ios::out );
INT g_iSum = 0;
void
dfs(
IN string strPath
)
{
_finddata_t file = { 0 };
string strPath1 = strPath + "/*.*";
INT iHandle = _findfirst( strPath1.c_str(), &file );
if( -1 == iHandle )
{
cout << "error";
}
else
{
do{
if( (0 == strcmp(file.name, ".")) ||
(0 == strcmp(file.name, "..")) )
{
continue;
}
if( file.attrib & _A_SUBDIR )
{
dfs( strPath + '/' + file.name );
}
else
{
cout << file.name << " " << ctime( &file.time_create ) << " " << ctime( &file.time_write ) << " " << file.size<< endl;
g_ofStream << file.name << " " << ctime( &file.time_create ) << " " << ctime ( &file.time_write ) << " " << file.size << endl;
g_iSum++;
}
} while( !_findnext( iHandle, &file ) );
_findclose( iHandle );
}
}
int main()
{
if( Wow64EnableWow64FsRedirection( FALSE ) )
{
dfs( "C:/Windows/System32" );
cout << g_iSum << endl;
}
Wow64EnableWow64FsRedirection( TRUE );
g_ofStream.close();
system("pause");
return 0;
}
代码运行效果:
总结
关于windows重定向暂时了解这些,之后会进行补充。