从 .net 4 c# 中解除文件阻止

34

有没有可能在C#程序内解除从互联网下载的文件的阻止?通过浏览互联网,我了解到,信息写在了一个(NTFS)文件的另一种流中,该流包含当前区域信息(值3来自互联网并被解释为已阻止)。

是否存在一种托管的方法来清除或更改文件的区域信息(取消阻止),或者是否存在一个托管的复制功能,可以在不包括外部程序集的情况下复制文件并去掉区域信息?如果没有,如何使用PInvoke实现,但又不包含外部程序集(在当前项目中不允许这样做)。


2
@Sven:谢谢,我以为我在问题中已经写得很清楚了。我的英语这么糟糕吗?不过还是谢谢你... :) - HCL
不过,显然我的阅读能力还不够好。 :) 为自己辩护一下,这里已经是午夜过后了。顺带一提,你将需要使用PInvoke,因为.Net System.IO类不支持备用数据流。 - Sven
请参见 https://dev59.com/33RB5IYBdhLWcg3wgHWr。 - stuartd
5个回答

42

根据您的输入,我已完成以下代码:

public class FileUnblocker {
    [DllImport("kernel32", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool DeleteFile(string name);

    public bool Unblock(string fileName) {
        return DeleteFile(fileName + ":Zone.Identifier");
    }
}

感谢Stuart Dunkeld、Alex K(+1)和Sven给我指引。

更新:我已经在这里发布了代码以获得反馈,看看它是否能够在生产环境中可靠地工作。如果有人想使用它,请前往该网址查看。


2
这样的更新应该作为问题的编辑发布。 - Sam Axe

21

它存储在:Zone.Identifier流中(more < c:\theapp.exe:Zone.Identifier) ,您需要使用本地IO例程来操作它们,这里有一个托管封装器


4
尽管目前这样做可能有效,但它只是一项具体实现细节。正如 @citizenmatt 所提到的,持久区标识符对象是创建这些对象的关键。因此,微软可能随时通过 Windows 更新或操作系统版本更改存储数据的方式/位置。 - Sam Axe

6

0

如果您只想解除文件的阻止,请使用PowerShell命令:

dir -r | unblock-files

切换到包含文件的文件夹并运行该命令。参数-r用于列出所有子文件夹中的文件。


0
我正在使用 .net 7,我发现这些做的是同样的事情。
解除阻塞:
void UnblockFile(string filePath)
{
    File.Delete(filePath + ":Zone.Identifier");
}

区块:

void BlockFile(string filePath)
{
    File.WriteAllText(filePath + ":Zone.Identifier", "[ZoneTransfer]\r\nZoneId=3");
}

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