如何检查文件是否具有备用数据流?

3

在Delphi中有没有一种方法可以检查文件是否具有任何备用数据流?


我不明白。你所说的“附加数据流”是什么意思?一个文件就成为了一个数据流。我从未听说过一个文件可以通过多个数据流进行访问。 - Jerry Dodge
1
几乎每个文件都有多个数据流:http://www.ntfs.com/ntfs-permissions-security-descriptor.htm - Sertac Akyuz
1
请参考 http://www.tek-tips.com/faqs.cfm?fid=7167。 - MartynA
2
不,@JerryDodge,这不是关于TStreamTFileStream的。我所指的流是附加到主文件的隐藏数据块。 - Marus Gradinaru
1
@Marus 是的,我明白了,在我的第一条评论之后还有许多其他评论。我只是想澄清我错了,并不是想提出另一个主张。 - Jerry Dodge
显示剩余6条评论
1个回答

6
请查看Win32 API FindFirstStreamW()FindNextStreamW() 函数:

枚举指定文件或目录中的第一个带有 ::$DATA 流类型的流。

继续先前调用 FindFirstStreamW 函数开始的流搜索。

但是,一个文件或目录可能有除 ::$DATA 之外的其他流类型,这些类型在 Win32 API 中无法枚举,它们是 NTFS 自身的内部数据。

有关详细信息,请参阅 MSDN。

使用流

文件流

要枚举非$DATA数据流,您需要直接读取文件系统,例如使用BackupRead()BackupSeek()。 有关详细信息,请参见CodeProject上的枚举备用数据流

谢谢。但是,你知道 CopyFileEx 是否会复制除 $DATA 以外的其他流吗?我想要的是在调用函数之前获取 CopyFileEx 将传输的所有数据的大小。 - Marus Gradinaru
1
@MarusNebunu 是的, CopyFileEx 会复制 ADS 流,正如文档中所述: "此函数保留扩展属性、OLE 结构化存储、NTFS 文件系统备用数据流、安全资源属性和文件属性。" 尝试使用 FindFirstFile()GetFileAttributesEx() 来查看它是否报告包括流在内的完整文件大小。或者,忘记预先检索大小,并让 CopyFileEx 回调在复制时告诉你。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接