在.NET中保留文件权限

3

我有一个经常被删除和重新创建的文件(我无法控制这种行为)。但是当文件重新创建时,它不会保留之前被删除前所拥有的权限。因此,我编写了以下代码来解决这个问题:

var access = File.GetAccessControl(filepath, AccessControlSections.Access);
deleteAndRecreate(filepath);
File.SetAccessControl(filepath, access);

但这样不起作用。如果我为文件明确授予“TestUser”的读取权限,则运行此代码后,“TestUser”将不再具有读取权限。我做错了什么?

你能做一些除了删除文件之外的事情吗...比如清空它?不存在的文件所起到的作用,一个空文件不能完成吗? - BlueMonkMN
你尝试在具有预设权限的目录下创建文件了吗? - L.B
@BlueMonkMN 我完全愿意这样做,但正如我所说,我无法控制其行为。这是第三方库的问题。 - Phil
很不幸我不太理解如何回答这个问题,但我猜想你不能将同一个FileSecurity对象的实例分配给除了获取它的文件以外的另一个文件。也许你可以通过阅读ACL技术概述(http://msdn.microsoft.com/en-us/library/ms229742.aspx)来自行解决这个问题。 - phoog
2
如果可以的话,最好在父文件夹上设置权限(一次),这样每当创建文件时,它就会默认继承正确的权限。 - Joe White
@JoeWhite 我同意。实际上这就是我正在做的事情,但是我使用的库(不知何故)会创建一个文件,该文件没有继承父文件夹的权限。我已经更新到最新版本的库,它没有这个问题。但是为了以后参考,我仍然很想看到这个问题的好答案。 - Phil
3个回答

0

尝试不带第二个参数

var access = File.GetAccessControl(filepath); 
deleteAndRecreate(filepath); 
File.SetAccessControl(filepath, access); 

这个执行没有异常吗? - ScottTx

0

我的猜想是,一旦文件被删除,由GetAccessControl返回的FileSecurity对象就不再有效。

你尝试过这样的方法吗(未经测试)?

deleteAndRecreate(filepath);
FileSecurity access = File.GetAccessControl(filepath, AccessControlSections.Access);
access.AddAccessRule(new FileSystemAccessRule(account, rights, controlType));

如果这种通用方法可行,您可能能够从之前创建的access对象中获取访问规则并重复使用它们。它们很可能会在删除后仍然有效。


-1
//Get current attributes
var fileAttributes = File.GetAttributes(filePath);

使用以下命令删除文件,重新创建文件并恢复原始权限:

//Restore the file's original attributes
File.SetAttributes(filePath, fileAttributes);

2
文件属性不包括访问控制权限。 - phoog
我检查了又检查,这似乎也不起作用。 - Phil
啊,好的,你说得对。这个代码只会维护"ReadOnly"和类似的属性,而不是特定于用户的访问权限。 - Matt Cofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接