我如何从.NET创建/删除/读/写/ NTFS备用数据流?
如果没有本机.NET支持,我会使用哪个Win32 API?另外,我如何使用它们,因为我不认为这是记录在案的?
是否有可能从ac#program中取消阻止从Internet下载的文件.浏览互联网我已经了解到,信息是在包含当前区域信息的(NTFS)文件的替代流中写入的(值3来自互联网并被解释为被阻止).
是否有管理的可能性来清除或更改文件的区域信息(解除阻止),或者是否存在托管复制功能,复制没有区域信息的文件?如果没有,我如何处理PInvoke但不包括外部程序集(我不允许在当前项目中执行此操作).
在这个问题中,我搜索了一个解锁文件的简单解决方案.感谢所有的评论和回答,我找到了PInvoking的简单解决方案DeleteFile.
它工作,但因为我从来没有通过PInvoke(Win32)使用文件操作,我不知道是否有一些陷阱或是否有另一种方法来调用DeleteFile删除文件的备用流.
我还不知道的是,如果我必须在try/catch中包装调用,或者仅仅查看布尔结果就足够了.在我的测试中,没有提出异常,但我不知道在现实世界中会发生什么.
public class FileUnblocker {
[DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool DeleteFile(string name );
public bool Unblock(string fileName) {
return DeleteFile(fileName+ ":Zone.Identifier");
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码看起来可靠吗?
更新
我发布了一个不完整的方法(unblock方法没有将"Zone.Identifier"文字连接到文件名).我现在纠正了这个,抱歉.
在Windows NTFS上有一个很好但很多未使用的功能,称为"备用数据流"(ADS),我最近在一个业余爱好开发项目中使用过.
在Mac HFS +上,还有一个类似的好但很多未使用的功能称为"命名分叉".
我正在考虑将这个项目移植到Linux,但我不知道linux上的任何Filesystem是否都有这样的功能?
今天我看到了这个奇怪的神奇NTFS系统支持:每个文件可以有多个数据流.基本上可以有一个a.txt0b大小的文件,但是在该文件的单独数据流中可以隐藏任意数量的字节.这是严格的NTFS相关魔法,我没有看到有这些流的任何高尚的原因.您可以streams在Sysinternals 的实用程序的帮助下查找NTFS流.这将告诉你,基本上每个讨厌的thumbs.db文件都附带一个额外的数据流.
好的,现在我已经看到了这个神奇的工作在Windows NT4系统上,流添加到文件,复制,删除(在上述实用程序的帮助下),但我现在在家里尝试这个我的Win XP系统,但是虽然我可以检测现有的流,我无法显示它们的内容,无法创建新的内容,或者在使用filename:streamname语法时无法显示任何内容.
我收到此错误:
文件名,目录名或卷标语法不正确.
示例:流实用程序的输出:
c:\DOWNLOADS>streams.exe -s .
Streams v1.56 - Enumerate alternate NTFS data streams
Copyright (C) 1999-2007 Mark Russinovich
Sysinternals - www.sysinternals.com
c:\DOWNLOADS\1013.pdf:
:Zone.Identifier:$DATA 46
c:\DOWNLOADS>type 1013.pdf:Zone.Identifier
The filename, directory name, or volume label syntax is incorrect.
Run Code Online (Sandbox Code Playgroud)
为什么我不能显示备用数据流的内容?
查看有关" 如何使用NTFS备用数据流 " 的Microsoft文档,我可以看到这适用于我的操作系统,尽管他们确实提到将来不支持这些流.任何人都可以对此有所了解吗?
我希望能够使用备用数据流来存储我正在构建的数据库应用程序中引用的文件的某些同步信息.
但是,我在网上找到的每种方法都以这种或那种方式失败了.在Win32 API编程中没有经验我不确定为什么会发生故障.在某些情况下,方法调用看似成功,只是没有备用流创建(即我以后不能从备用文件中读取,也可以AlternateStreamViewer看到它).在其他情况下,写入成功,但读取失败,因为调用CreateFile()会导致无效的SafeFileHandle.
在这一点上,我只想找到一些工作代码.或者被告知"你不能从这里到达那里".在这种情况下,我将使用另一个不太吸引人的选项(例如,编码文件名本身的同步/参考信息,并希望没有人更改文件名).
我理解我尝试过的方法的要求.但是有很多(我花了几个小时),我真的很想学习我没有尝试过的产品.
但是,你是对的,它会有所帮助,因为事实证明我正在使用其中一种方法 - 下面提到的Trinet - 不正确.我认为问题是我还没有创建我试图保存备用流的"基础"文件.
这是我尝试的代码库的链接:
从版本 8.1 到 Mountain Lion (10.8),操作系统支持一个名为“ Named Forks ”的概念。命名分叉相当于 Windows 中的“备用数据流”。
现在,互联网上对命名分叉与资源分叉以及命名分叉与扩展属性之间存在大量混淆。这是显示它们都是独立概念的时间表:
所有操作系统版本和所有 Apple 文件系统上始终存在数据分叉和资源分叉。如今,操作系统似乎唯一使用资源分叉的地方是为文件夹提供自定义图标。这将创建一个名为 的文件,该文件Icon\r带有零长度数据分叉和资源分叉中的图像数据。文件名包含实际的回车符!
在引入扩展属性之前,命名分叉已得到支持 7 年。
HFS+ 绝对支持命名分叉和扩展属性 8 年,尽管我不知道一个文件是否可以同时拥有这两种属性,或者它们是否与 Mavericks 之前的命名分叉和 Mavericks 之后的扩展属性相同。
命名分叉在 APFS 推出前 4 年就已被弃用。
命名叉子从来没有被广泛使用过。我编写了代码来尝试调用FSCreateFork文件和目录。无论是在 HFS+ 还是 APFS 卷上,无论我在 Big Sur 还是 Sierra 下运行它,它总是会失败并出现错误 -1402“Fork name 参数错误”。我无法访问其他操作系统版本。
所以由于我找不到测试的方法,而且网上的信息也很混乱,所以我无法谷歌它。
这里有专家知道 APFS 是否支持命名分叉吗?
Mercurial如何处理备用数据流(在NTFS文件系统中)?如果它无法解决这个问题,DCVS会有吗?
编辑:当我通过更新更改版本时,ADS会发生什么?丢失(擦除)了吗?它也是版本化的吗?它完全被忽略了吗?
我试图让我的 Java 应用程序读取给定路径中的所有数据。文件、目录、元数据等。这还包括 NTFS 称为备用数据流 (ADS) 的一个奇怪的东西。
显然,它就像目录或文件中的第二层数据。您可以打开命令提示符并使用“:”在ADS中创建文件,例如:
C:\ADSTest> echo test>:ads.txt
Run Code Online (Sandbox Code Playgroud)
所以,
C:\ADSTest> notepad :ads.txt
Run Code Online (Sandbox Code Playgroud)
应该打开一个记事本,其中包含字符串“test”。但是,如果您这样做:
C:\ADSTest> dir
Run Code Online (Sandbox Code Playgroud)
您将无法看到 ads.txt。但是,如果您使用显示 ADS 数据的 dir 选项,您将能够看到它:
C:\ADSTest> dir /r
MM/dd/yyyy hh:mm .:ads.txt
Run Code Online (Sandbox Code Playgroud)
现在,我知道Java IO具有读取ADS的能力。我怎么知道呢?嗯,Oracle 的文档明确指出了这一点:
如果文件系统实现支持的文件属性不足以满足您的需求,您可以使用 UserDefinedAttributeView 创建和跟踪您自己的文件属性。
一些实现将此概念映射到 NTFS 替代数据流等功能以及文件系统(如 ext3 和 ZFS)上的扩展属性。
另外,随机论坛上的随机帖子:D
数据存储在 NTFS 备用数据流 (ADS) 中,可通过 Java IO 读取(我已经测试过)。
问题是,我找不到任何可以解析ADS的预先编写的文件属性查看器,而且我不明白如何编写自己的ADS解析器。我是一名初学者程序员,所以我觉得这超出了我的能力范围。有人可以帮助我或指出我正确的方向吗?
编辑:在@knosrtum的帮助下,我能够编写一种方法,该方法将从给定路径返回所有已解析的ADS信息作为字符串ArrayList(它也可以轻松编辑为文件ArrayList)。以下是任何可能需要它的人的代码:
public class ADSReader {
public static ArrayList<String> start(Path toParse) {
String path = toParse.toString();
ArrayList<String> parsedADS = new ArrayList<>();
final String command …Run Code Online (Sandbox Code Playgroud) 我的最终目标是 cd 到 powershell 中的目录,然后列出所有备用数据流文件,然后将其所有内容输出到 CSV。
我目前已经编写了前两部分的脚本:
cd c:\users\profilename\downloads\
gci -recurse | % { gi $_.FullName -stream * } | where stream -ne ':$Data'
Run Code Online (Sandbox Code Playgroud)
要打开示例数据流文件,请打开 cmd,cd 到目录,然后运行:
dir /r
Run Code Online (Sandbox Code Playgroud)
之后,获取其中一个文件的区域标识名称并运行此命令(不带 :$data)。
删除之前的示例:$Data
notepad test.docx:Zone.Identifier:$Data
Run Code Online (Sandbox Code Playgroud)
删除后(运行此命令):
notepad test.docx:Zone.Identifier
Run Code Online (Sandbox Code Playgroud)
我将如何获取第二个命令的输出并使用 PSPath 字段打开每个文件,然后将所有内容输出到一个 CSV 文件中?
任何帮助是极大的赞赏。
我想用 Powershell 阻止(而不是解除阻止)一个文件。我想让 Windows 相信磁盘上的文件是从 Internet 下载的,或者存在任何其他导致文件被阻止的情况。我需要这个来测试我正在开发的某些软件在存在被阻止文件的情况下的行为。
windows powershell file alternate-data-stream powershell-4.0
我已经使用 GUI .net 框架构建了一个 powershell 脚本,该框架为用户提供了一个图形界面,以将备用数据流 (ADS) 添加到 NTFS 文件系统上的文件。
下面是我为 powershell 脚本编写的代码:
<#
This script is a GUI featured way to add extended attributes to files
#>
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
#region begin GUI{
$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '600,600'
$Form.text = "Add Extended Attributes"
$Form.TopMost = $false
# Add Extended Attributes Label
$mainLabel = New-Object system.Windows.Forms.Label
$mainLabel.text = "Add Extended Attributes"
$mainLabel.AutoSize = $true
$mainLabel.width = 25
$mainLabel.height = 10
$mainLabel.location = New-Object System.Drawing.Point(180,10)
$mainLabel.Font = 'Microsoft …Run Code Online (Sandbox Code Playgroud) 我已经阅读了一些文档Alternate Data Streams,我正在考虑在我自己的项目中使用它们.然而,在我决定使用它们之前,我还有很多未知的知识和开放的问题.这就是我提出这个问题清单的原因:
streams?LoadLibraryAPI从流加载DLL吗?ShellExecute)流?Alternate Data Streams?Alternate Data Streams吗?我期待你的答案/信息/总结.最好的语言是Delphi,但任何其他语言都可以,只要它使用WinAPI.