有没有可能在C#程序内解除从互联网下载的文件的阻止?通过浏览互联网,我了解到,信息写在了一个(NTFS)文件的另一种流中,该流包含当前区域信息(值3来自互联网并被解释为已阻止)。
是否存在一种托管的方法来清除或更改文件的区域信息(取消阻止),或者是否存在一个托管的复制功能,可以在不包括外部程序集的情况下复制文件并去掉区域信息?如果没有,如何使用PInvoke实现,但又不包含外部程序集(在当前项目中不允许这样做)。
有没有可能在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");
}
}
感谢Stuart Dunkeld、Alex K(+1)和Sven给我指引。
更新:我已经在这里发布了代码以获得反馈,看看它是否能够在生产环境中可靠地工作。如果有人想使用它,请前往该网址查看。
管理此标识符的官方方式是使用PersistentZoneIdentifier COM对象:http://msdn.microsoft.com/zh-cn/library/ms537029(v=vs.85).aspx
如果您只想解除文件的阻止,请使用PowerShell命令:
dir -r | unblock-files
切换到包含文件的文件夹并运行该命令。参数-r用于列出所有子文件夹中的文件。
void UnblockFile(string filePath)
{
File.Delete(filePath + ":Zone.Identifier");
}
区块:
void BlockFile(string filePath)
{
File.WriteAllText(filePath + ":Zone.Identifier", "[ZoneTransfer]\r\nZoneId=3");
}