关于Windows操作系统重定向


前言

用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重定向暂时了解这些,之后会进行补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值