#include <stdio.h>
#include <windows.h>
int ReadStream( HANDLE hFile, bool bIsDirectory, char* FileName )
{
//数据流文件名查找
//
//输入:
// 已打开的文件句柄
// bIsDirectory
// 文件名, 用于显示数据流在哪个文件中
//结果:
// 直接在函数中输出
//返回:
// Count:数据流的个数
WIN32_STREAM_ID sid; //数据流头结构
LPVOID lpContext = NULL; //环境指针,读取数据流时,必须为空
DWORD dwRead = 1; //实际读取的大小
int Success;
int Count = 0; //数据流的个数
UCHAR *Buffer; //动态分配的空间指针
bool bIsFirst = true; //是否为所查找到的第一个数据流名
ZeroMemory( &sid, sizeof( WIN32_STREAM_ID ) ); //清空sid
//数据流头大小,实际为20字节
DWORD dwStreamHeaderSize = (LPBYTE)&sid.cStreamName - (LPBYTE)&sid;
/*
if( strcmp( FileName, "F://VC 6//Contrl控制台程序//DataStreamFinder//test//test//Last.txt" ) == 0 )
{
//打印出所有流字符
UCHAR *Buffer1 = (UCHAR*)malloc(50000);
memset( Buffer1, 0, 50000);
Success = ::BackupRead( hFile, (LPBYTE)Buffer1, 50000, &dwRead, false, false, &lpContext );
printf( "Size of Head: %d/n", dwStreamHeaderSize );
for( unsigned int i=0; i<dwRead; i ++ )
{
printf( "(%d)%c", i, Buffer1[i] );
}
printf( "/n" );
return 0;
}
*/
if( !bIsDirectory ) //如果不是目录,就执行此段
{
//读取原始文件头
Success = ::BackupRead( hFile, (LPBYTE)&sid, dwStreamHeaderSize, &dwRead, false, false, &lpContext );
if( !Success ) //读取原始文件头失败
{
return 0;
}
//读取源文件内容
char Len64[25];
DWORD OrgFileLen;
ZeroMemory( Len64, sizeof( Len64 ) );
//将i64转为DWORD型
sprintf( Len64, "%u", sid.Size );
OrgFileLen = atol( Len64 );
//跳过文件内容
DWORD FileLenL, FileLenH;
Success = ::BackupSeek( hFile, OrgFileLen, NULL, &FileLenL, &F