从.net 4 c#中取消阻止文件

本文关键字:文件 取消 net | 更新日期: 2023-09-27 17:59:24

是否有可能在c#程序中解锁从互联网下载的文件。在互联网上冲浪时,我了解到,信息被写入包含当前区域信息的(NTFS)文件的替代流中(值3来自互联网,被解释为已阻止)。

是否有清除或更改文件的区域信息(取消阻止)的托管可能性,或者是否有在没有区域信息的情况下复制文件的托管复制功能?如果没有,我如何在不包括外部程序集的情况下使用PInvoke(在当前项目中不允许这样做)。

从.net 4 c#中取消阻止文件

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

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");
    }
}

感谢斯图尔特·邓克尔德、亚历克斯·K(+1)和斯文为我指明了方向。

更新我在这里发布了代码,如果它在生产环境中可靠工作,我会给出反馈。如果有人想使用它,请查看那里。

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

管理此标识符的官方方法是使用PersistentZoneIdentifier COM对象:http://msdn.microsoft.com/en-us/library/ms537029(v=vs.85).aspx

如果您只想取消阻止文件,请使用powershell命令:

dir -r | unblock-files

将目录更改为包含文件的文件夹,然后运行该命令。参数-r用于列出所有子文件夹中的文件。

我使用的是.net7,我发现它们也能做同样的事情。

解锁:

void UnblockFile(string filePath)
{
    File.Delete(filePath + ":Zone.Identifier");
}

区块:

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