如何撤销文件的写权限,使其无法在 C# 中删除
Posted
技术标签:
【中文标题】如何撤销文件的写权限,使其无法在 C# 中删除【英文标题】:How do I revoke write permission from a file so that it can't be deleted in C# 【发布时间】:2013-11-21 11:43:57 【问题描述】:在 NUnit 测试中,我需要检查是否可以删除现有文件。 UnitUnderTest 源代码如下所示:
public static Boolean IsWritePermissionGranted(String absoluteFilePath)
Boolean isGranted = true;
try
FileIOPermission writePermission = new FileIOPermission(
FileIOPermissionAccess.Write, absoluteFilePath);
writePermission.Demand();
catch (SystemException)
isGranted = false;
return isGranted;
在测试用例中,我想撤销 TestFile 的写权限。到目前为止,我尝试过:
-
https://***.com/a/7590491/1817029
AddFileSecurity(TEST_FILE_PATH, @"MyDomain\MyUser", FileSystemRights.Write, AccessControlType.Deny);
DirectoryInfo dInfo = new DirectoryInfo(TEST_FILE_PATH);
DirectorySecurity dSecurity = dInfo.GetAccessControl();
dSecurity.AddAccessRule(new FileSystemAccessRule(
TEST_FILE_PATH, "MyDomain\MyUser", FileSystemRights.Write, AccessControlType.Deny));
dInfo.SetAccessControl(dSecurity);
在所有情况下,文件仍然可以被删除。我做错了什么?
【问题讨论】:
【参考方案1】:防止意外删除的最简单快捷的方法就是将其设为只读:
File.SetAttributes(path, FileAttributes.ReadOnly);
任何希望修改或删除此文件的代码都必须首先明确删除只读属性(即再次调用SetAttributes
)。
您还应该永远捕获SystemException
(或Exception
),无论如何您的示例代码正在处理与文件安全无关的CAS。
【讨论】:
谢谢! [...无论如何,您的示例代码正在处理与文件安全无关的 CAS。] 您是否参考writePermission.Demand();
此外,我仍然可以使用以下命令删除文件:File.Delete(TEST_FILE_PATH);
是的。如果您查看documentation for the Demand method,您应该会发现它显然不适用于您的场景。实际上,除了实际尝试删除文件并捕获IOException
或SecurityException
(如果失败)之外,实际上没有可靠的方法来测试是否可以删除文件。您的测试正在检查一种完全不相关的权限,并且在完全信任的情况下运行时将始终返回 true。见here
我将此作为问题的解决方案(仅作为评论):***.com/q/19860927/1817029 我问了这个问题,因为SecurityManager.IsGranted
方法被标记为已过时。你能回答这个问题吗? ***.com/q/19860927/1817029 THX!
该问题已结束。有很多重复,但最好的可能是我在上一条评论中链接到的那个。以上是关于如何撤销文件的写权限,使其无法在 C# 中删除的主要内容,如果未能解决你的问题,请参考以下文章