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

HCL*_*HCL 29 .net c# pinvoke .net-4.0 alternate-data-stream

是否有可能从ac#program中取消阻止从Internet下载的文件.浏览互联网我已经了解到,信息是在包含当前区域信息的(NTFS)文件的替代流中写入的(值3来自互联网并被解释为被阻止).

是否有管理的可能性来清除或更改文件的区域信息(解除阻止),或者是否存在托管复制功能,复制没有区域信息的文件?如果没有,我如何处理PInvoke但不包括外部程序集(我不允许在当前项目中执行此操作).

HCL*_*HCL 34

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢Stuart Dunkeld,Alex K(+1)和Sven向我展示了方向.

更新 我已在此处发布代码,以获得反馈,以确保它在生产环境中可靠运行.如果有人想使用它,请查看那里.

  • 像这样的更新应作为您的问题的编辑发布. (2认同)

Ale*_* K. 17

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

  • 虽然这可能现在有效,但它是一个实现细节.@citizenmatt提到的[持久区域标识符对象](https://msdn.microsoft.com/en-us/library/ms537029(v = vs.85).aspx)负责创建这些对象.因此,MS可以随时通过Windows更新或OS版本更改数据的存储方式/位置. (3认同)

cit*_*att 6

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