路径访问被拒绝

4

对于我的WPF应用程序,我必须创建带有图像文件的文件夹,例如:C:\Pearl\Src\TEMP。稍后当这些文件不再需要时,我会通过编程方式删除这些文件夹。但是我遇到了“访问路径被拒绝”的错误。我也尝试为创建的临时文件夹分配访问权限,但并没有太大作用。

using System.IO;

var activeDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

var dInfo = Directory.GetParent(Path.GetDirectoryName(activeDir);

var dSecurity = dInfo.GetAccessControl();

dSecurity.AddAccessRule(new FileSystemAccessRule(@"ATSDEV\ABCD", FileSystemRights.DeleteSubdirectoriesAndFiles, AccessControlType.Allow));

dInfo.SetAccessControl(dSecurity); // Set the new access settings.

var ImageDir = Path.Combine(dInfo.ToString(), "TEMP");

System.IO.Directory.CreateDirectory(ImageDir, dSecurity);

你能发一下抛出异常的确切代码行吗? 看起来错误是由于获取路径名的方式引起的。 - LoSciamano
你确定你没有任何句柄(文件)仍然处于打开状态吗? - Polyfun
4
它被称为UAC。你不应该在那个目录中写入任何内容。幸运的是,有替代方案。 - Cody Gray
感谢您的回复。我使用的是Windows XP系统。尽管如此,我仍然尝试了上述AppData文件夹。但结果仍然一样。现在的路径是C:\Documents and settings\UserName\Application Data\672011115302AM。 - user296623
LoSciamano:这里是报错的代码:File.Delete(p_folderpath); 其中p_folderpath为C:\Documents and Settings\UserName\Application Data\672011115302AM。 - user296623
这听起来很奇怪,但XP的用户访问控制较弱。也许你可以像这个回答建议的那样使用临时目录。 - LoSciamano
3个回答

8
在Vista+中,您不应该向安装文件夹或执行进程的父文件夹写入任何内容。相反,您应该考虑写入用户的AppData文件夹中的子目录,因为这样更合适,也不会导致权限问题。
您可以通过Environment.GetFolderPathEnvironment.SpecialFolder.ApplicationData)获取适当的文件夹。

感谢您的回复。我使用的是Windows XP系统。尽管如此,我仍然尝试了上述AppData文件夹。但结果仍然一样。现在的路径是C:\Documents and settings\UserName\Application Data\672011115302AM。 - user296623
@user296623:是的,在XP中,这也是首选。但在Vista+中,你会遇到更多问题... - Reed Copsey
如果您无法删除文件夹,那很可能是因为其中某个文件被打开并被占用了。 - Reed Copsey

2
我也遇到了这个问题,所以我找到了这篇文章。我在复制/删除之前和之后添加了以下代码:

删除

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

复制

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

1

或者你可以使用 Path.GetTempPath() 来获取临时目录的路径,并在其中创建你的临时数据。

使用临时文件的好处是,如果你忘记清理它或者清理失败,当磁盘空间不足时,系统会帮助你清理它。


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