从.net 4 c#中取消阻止文件
本文关键字:文件 取消 net | 更新日期: 2023-09-27 17:59:24
是否有可能在c#程序中解锁从互联网下载的文件。在互联网上冲浪时,我了解到,信息被写入包含当前区域信息的(NTFS)文件的替代流中(值3来自互联网,被解释为已阻止)。
是否有清除或更改文件的区域信息(取消阻止)的托管可能性,或者是否有在没有区域信息的情况下复制文件的托管复制功能?如果没有,我如何在不包括外部程序集的情况下使用PInvoke(在当前项目中不允许这样做)。
根据您的输入,我完成了以下代码:
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");
}