在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/