Readers: 512 | Updated: 01-30

从NTFS文件系统中判断文件是否有ADS(Alternate Data Streams)

Translate Into:

据我所知道的(如果您还知道更好的方法,请指教,谢谢),在Windows中有两套API可以读取NTFS系统中的流数据:第一套为FindFirstStreamW和FindNextStreamW(). 这套API铜FindFirstFile之类的API使用相仿,但该套API仅能在Windows2003上使用;另一套为备份使用的API,如BackupRead和BackupSeek。为了兼容各种平台,我们这里使用备份API。

首先,说明一下如何创建ADS:启动cmd,在命令行上输入:echo 测试ADS c:\a.txt:ccc。这样在c:\a.txt文件中就包含了除主流之外的ADS数据,程序判断该文件时候有流的方式很简单,主要的代码如下所示:

/* 返回0说明函数运行成功,且文件中存在ADS fileName:输入参数 infos:输出参数,是一个存放ads名称和预览数据的数组 */

int GetStreamInfo( LPCTSTR fileName,std::vector<CStreamInfo>* infos )
{
BOOL bContinue = FALSE;
DWORD dwRead;
LPVOID lpContext = NULL;
WIN32_STREAM_ID sid;
HANDLE hFile;
DWORD dwStreamHeader;
CStreamInfo info;

hFile = CreateFile( fileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL );
if( hFile == INVALID_HANDLE_VALUE )
return GetLastError();

do
{
ZeroMemory( &sid,sizeof( WIN32_STREAM_ID ) );

dwStreamHeader = (LPBYTE)sid.cStreamName - (LPBYTE)&sid + sid.dwStreamNameSize;
bContinue = BackupRead( hFile,(LPBYTE)&sid,dwStreamHeader,&dwRead,FALSE,FALSE,&lpContext );

if( sid.dwStreamNameSize <= 0 )
break;

if( bContinue )
{
if( !dwRead )
break;

TCHAR name[MAX_PATH];
ZeroMemory( name,sizeof(name) );
bContinue = BackupRead( hFile,(LPBYTE)name,sid.dwStreamNameSize,&dwRead,FALSE,FALSE,&lpContext );

if( bContinue )
{
BYTE chs[64];
TCHAR chhh[64];
ZeroMemory( chs,sizeof( chs ) );
ZeroMemory( chhh,sizeof( chhh ) );
DWORD dwToRead = sid.Size.LowPart < sizeof( chs ) ? sid.Size.LowPart : sizeof(chs);

info.m_strName = name;
BackupRead( hFile,chs,dwToRead ,&dwRead,FALSE,FALSE,&lpContext );

MultiByteToWideChar( CP_ACP,MB_PRECOMPOSED,(LPCSTR)chs,dwRead,chhh,dwRead );

info.m_strPreview = chhh;

DWORD dw1,dw2;
BackupSeek( hFile,sid.Size.LowPart - dwToRead ,sid.Size.HighPart,&dw1,&dw2,&lpContext );

infos->push_back( info );
}
}

}while( bContinue );

BackupRead( hFile,NULL,0,&dwRead,TRUE,FALSE,&lpContext );


CloseHandle( hFile );

return 0;
}

这仅仅是个简单的封装,很容易应用到自己的程序,呵呵。


Technorati :



C01141307 2008-01-22 19:34 发表评论


From The Blogs

TechCrunch

03-28
The New York Post Got It Wrong—Microsoft’s Alternate Board Slate For Yahoo Is All Sewn Up
This morning, the New York Post ran a story with this headline: MSOFT NOT YET ON BOARD NO NAMES LINED UP YET FOR YAHOO! The article goes on to suggest that nobody in Silicon Valley wants to be on Micr... 查看全文

Internet Observation

2007
Carbonite:在线备份与存储
http://www.carbonite.com Carbonite 可以让您轻松进行备份由用户产生的数据。(包括照片、word文档、excel、powerpoint等)。快注册吧,剩下的事就全交给C... 查看全文

E-space

01-31
BitLet加入BT音乐文件在线收听功能
BitLet能够直接通过网页来下载BT文件,只需要提交种子地址即可。现在BitLet又新推出了直接从BitTorrent文件中在线收听音乐的服务BitLet Music,只要种子中包含有ogg或者mp... 查看全文

一五一十部落推荐文章

03-07
微软推出Office Live Workspace文件共享服务
自从Google发布Google Docs以来,Adobe也在去年推出了文件共享服务Adobe Share。一直按耐不住的微软也在去年年底推出了Office Live Workspace英文测试版。最... 查看全文

Internet Observation

2007
Pando--发送大容量邮件
http://www.pando.com/ Pando是一种免费的个人P2P软件,它能轻松的收发大容量的文件。您需要用电子邮件发送大容量的附件,实时传讯文件或是在网络上发布你的可下载视频吗?那就赶快用... 查看全文

Internet Observation

2007
Post282-建立自己的私人空间
http://www.post282.com Post282是基于网络的开放资源系统,为创建私人社区博客而设计。 Post282不久后将提供免费帐户,您可以建立自己的社区,邀请朋友,您的私人网站也可在... 查看全文

Internet Observation

11-14
精简PPt文件的9条策略
提出了9条策略精简PPt文件,于办公室人员很是有用,随后我会逐一翻译9条措施,该网站并未列出,我还得自采自译 查看全文

鬼仔's Blog

11-15
打造XP下可运行的微型PE文件(292字节)
# 鬼仔:该文作者是《疯狂的程序员》的作者,现在《疯狂的程序员》已经写完了,还没来得及看。 作者:hitetoshi 前几天和朋友交流技术,提到手工打造微型PE文件,他说现在网上流传的大部分版本在XP... 查看全文

鬼仔's Blog

11-15
打造XP下可运行的微型PE文件(292字节)
# 鬼仔:该文作者是《疯狂的程序员》的作者,现在《疯狂的程序员》已经写完了,还没来得及看。 作者:hitetoshi 前几天和朋友交流技术,提到手工打造微型PE文件,他说现在网上流传的大部分版本在XP... 查看全文

生活点滴Enjoy Life

11-15
关于web方式上传大文件的问题
最近对web方式上传大文件比较感兴趣,一直在尝试如何通过php上传大文件。不过你放心,cosbeta这篇文章不是告诉你如何修改php.ini中的post_max_size和upload_max_fil... 查看全文
More Articles