﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C01141307</title><link>http://www.cppblog.com/C01141307/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:06:40 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:06:40 GMT</pubDate><ttl>60</ttl><item><title>从NTFS文件系统中判断文件是否有ADS（Alternate Data Streams）</title><link>http://www.cppblog.com/C01141307/archive/2008/01/22/41654.html</link><dc:creator>C01141307</dc:creator><author>C01141307</author><pubDate>Tue, 22 Jan 2008 11:34:00 GMT</pubDate><guid>http://www.cppblog.com/C01141307/archive/2008/01/22/41654.html</guid><wfw:comment>http://www.cppblog.com/C01141307/comments/41654.html</wfw:comment><comments>http://www.cppblog.com/C01141307/archive/2008/01/22/41654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/C01141307/comments/commentRss/41654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/C01141307/services/trackbacks/41654.html</trackback:ping><description><![CDATA[<p>据我所知道的（如果您还知道更好的方法，<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#114;&#111;&#103;&#46;&#99;&#104;&#101;&#110;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">请指教</a>，谢谢），在Windows中有两套API可以读取NTFS系统中的流数据：第一套为<span style="FONT-FAMILY: Courier New">FindFirstStreamW和</span><code>FindNextStreamW()</code>. 这套API铜FindFirstFile之类的API使用相仿，但该套API仅能在Windows2003上使用；另一套为备份使用的API，如BackupRead和BackupSeek。为了兼容各种平台，我们这里使用备份API。</p>
<p>首先，说明一下如何创建ADS：启动cmd，在命令行上输入：<code><strong>echo 测试ADS c:\a.txt:ccc</strong></code>。这样在c:\a.txt文件中就包含了除主流之外的ADS数据，程序判断该文件时候有流的方式很简单，主要的代码如下所示：</p>
<p><code><span style="FONT-FAMILY: Times New Roman">/* 返回0说明函数运行成功，且文件中存在ADS fileName：输入参数 infos：输出参数，是一个存放ads名称和预览数据的数组 */</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman"><code><span style="FONT-FAMILY: Times New Roman">int GetStreamInfo( LPCTSTR fileName,std::vector&lt;CStreamInfo&gt;* infos )<br>{<br>BOOL bContinue = FALSE;<br>DWORD dwRead;<br>LPVOID lpContext = NULL;<br>WIN32_STREAM_ID sid;<br>HANDLE hFile;<br>DWORD dwStreamHeader;<br>CStreamInfo info;</span></code></span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">hFile = CreateFile( fileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL );<br>if( hFile == INVALID_HANDLE_VALUE )<br>return GetLastError();</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">do<br>{<br>ZeroMemory( &amp;sid,sizeof( WIN32_STREAM_ID ) );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">dwStreamHeader = (LPBYTE)sid.cStreamName - (LPBYTE)&amp;sid + sid.dwStreamNameSize;<br>bContinue = BackupRead( hFile,(LPBYTE)&amp;sid,dwStreamHeader,&amp;dwRead,FALSE,FALSE,&amp;lpContext );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">if( sid.dwStreamNameSize &lt;= 0 )<br>break;</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">if( bContinue )<br>{<br>if( !dwRead )<br>break;</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">TCHAR name[MAX_PATH];<br>ZeroMemory( name,sizeof(name) );<br>bContinue = BackupRead( hFile,(LPBYTE)name,sid.dwStreamNameSize,&amp;dwRead,FALSE,FALSE,&amp;lpContext );<br><br>if( bContinue )<br>{<br>BYTE chs[64];<br>TCHAR chhh[64];<br>ZeroMemory( chs,sizeof( chs ) );<br>ZeroMemory( chhh,sizeof( chhh ) );<br>DWORD dwToRead = sid.Size.LowPart &lt; sizeof( chs ) ? sid.Size.LowPart : sizeof(chs);</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">info.m_strName = name;<br>BackupRead( hFile,chs,dwToRead ,&amp;dwRead,FALSE,FALSE,&amp;lpContext );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">MultiByteToWideChar( CP_ACP,MB_PRECOMPOSED,(LPCSTR)chs,dwRead,chhh,dwRead );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">info.m_strPreview = chhh;<br><br>DWORD dw1,dw2;<br>BackupSeek( hFile,sid.Size.LowPart - dwToRead ,sid.Size.HighPart,&amp;dw1,&amp;dw2,&amp;lpContext );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">infos-&gt;push_back( info );<br>}<br>}</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">}while( bContinue );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman">BackupRead( hFile,NULL,0,&amp;dwRead,TRUE,FALSE,&amp;lpContext );</span></code></p>
<p><code><span style="FONT-FAMILY: Times New Roman"><br>CloseHandle( hFile );</span></code></p>
<p>return 0;<br>}</p>
<p>这仅仅是个简单的封装，很容易应用到自己的程序，呵呵。<br></p>
<p><br></p>
<p class=zoundry_bw_tags><!-- Tag links generated by Zoundry Blog Writer. Do not manually edit. http://www.zoundry.com --><span class=ztags><span class=ztagspace>Technorati</span> : <a class=ztag href="http://technorati.com/tag/ADS%20BackupRead%20BackupSeek" rel=tag>ADS BackupRead BackupSeek</a></span> </p>
<img src ="http://www.cppblog.com/C01141307/aggbug/41654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/C01141307/" target="_blank">C01141307</a> 2008-01-22 19:34 <a href="http://www.cppblog.com/C01141307/archive/2008/01/22/41654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于在CNBLOG安家了</title><link>http://www.cppblog.com/C01141307/archive/2008/01/10/40921.html</link><dc:creator>C01141307</dc:creator><author>C01141307</author><pubDate>Thu, 10 Jan 2008 12:12:00 GMT</pubDate><guid>http://www.cppblog.com/C01141307/archive/2008/01/10/40921.html</guid><wfw:comment>http://www.cppblog.com/C01141307/comments/40921.html</wfw:comment><comments>http://www.cppblog.com/C01141307/archive/2008/01/10/40921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/C01141307/comments/commentRss/40921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/C01141307/services/trackbacks/40921.html</trackback:ping><description><![CDATA[
<p>以前在csdn感觉没有客户端不是很舒服，现在来到cnblog终于可以使用客户端了。哈哈！！！</p>
<img src ="http://www.cppblog.com/C01141307/aggbug/40921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/C01141307/" target="_blank">C01141307</a> 2008-01-10 20:12 <a href="http://www.cppblog.com/C01141307/archive/2008/01/10/40921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>