File.Move 不从目标目录继承权限?
Posted
技术标签:
【中文标题】File.Move 不从目标目录继承权限?【英文标题】:File.Move does not inherit permissions from target directory? 【发布时间】:2011-02-25 04:09:50 【问题描述】:如果在创建文件时出现问题,我一直在写入一个临时文件,然后移动到目的地。比如:
var destination = @"C:\foo\bar.txt";
var tempFile = Path.GetTempFileName();
using (var stream = File.OpenWrite(tempFile))
// write to file here here
string backupFile = null;
try
var dir = Path.GetDirectoryName(destination);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
Util.SetPermissions(dir);
if (File.Exists(destination))
backupFile = Path.Combine(Path.GetTempPath(), new Guid().ToString());
File.Move(destination, backupFile);
File.Move(tempFile, destination);
if (backupFile != null)
File.Delete(backupFile);
catch(IOException)
if(backupFile != null && !File.Exists(destination) && File.Exists(backupFile))
File.Move(backupFile, destination);
问题是在这种情况下新的“bar.txt”没有从“C:\foo”目录继承权限。但是,如果我通过资源管理器/记事本等直接在“C:\foo”中创建文件,则没有问题,所以我相信“C:\foo”上的权限设置正确。
更新
找到Inherited permissions are not automatically updated when you move folders,也许它也适用于文件。现在正在寻找一种强制更新文件权限的方法。有没有更好的方法来做到这一点?
【问题讨论】:
【参考方案1】:发现我需要的是这样的:
var fs = File.GetAccessControl(destination);
fs.SetAccessRuleProtection(false, false);
File.SetAccessControl(destination, fs);
这会将文件权限重置为继承。
【讨论】:
文件已被移动后是否必须执行此操作?在这种情况下,它不再是原子的 - 有人可能会在权限到位之前尝试读取文件 @Neil 是的,这将是在移动之后,是的,它将使它不再是原子的。 @JosephKingry。谢谢,这帮助了我。但是,我还想删除移动导致的任何显式权限。只需多几行代码。 ***.com/a/12821819/486660 复制文件时是否也需要这样做,或者在这种情况下是否会自动继承权限?以上是关于File.Move 不从目标目录继承权限?的主要内容,如果未能解决你的问题,请参考以下文章