this question中,我搜索了一种简单的解决方案来取消阻止文件。
感谢所有的评论和回答,我通过PInvoking DeleteFile找到了一个简单的解决方案。

它可以工作,但是因为我从未使用过通过PInvoke(Win32)进行文件操作,所以我不知道是否存在一些陷阱或是否存在另一种调用DeleteFile来删除文件的备用流的方法。

我也不知道的是我是否必须将调用包装在try/catch中,或者仅查看 bool 结果是否足够。在我的测试中,没有提出异常,但是我不知道现实世界中会发生什么。

public class FileUnblocker {

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

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

此代码看起来可靠吗?

更新
我发布了一个不完整的方法(unblock方法未将“Zone.Identifier”文字连接到文件名)。抱歉,我现在已纠正此问题。

最佳答案

调用本地方法永远不会引发异常。如果由于某种原因文件删除失败,则对DeleteFile的调用将返回false。

您的P/调用代码是好的。您正确使用了Unicode字符,将SetLastError设置为true,并且编码参数正确。要检查错误,请从DeleteFile中查找 bool 值。如果为假(即调用失败),则调用 Marshal.GetLastWin32Error 找出Win32错误代码。

函数失败的最明显原因是:

  • 该文件不存在。
  • 备用流不存在。
  • 该进程没有足够的权限删除替代流。

  • 对于1和2,将返回 ERROR_FILE_NOT_FOUND 的错误代码。对于3,您将得到一个错误代码 ERROR_ACCESS_DENIED

    关于c# - 此PInvoke代码正确且可靠吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6375599/

    10-11 23:03
    查看更多