【问题标题】:UnauthorizedAccessException on newly created files新创建的文件出现 UnauthorizedAccessException
【发布时间】:2010-01-05 16:18:48
【问题描述】:

我有一个应用程序正在查看一些文件以查找旧数据。为了确保我们不会破坏好的项目,我将文件复制到一个临时位置。我正在检查的一些目录是源代码目录,它们有 .svn 文件夹。我们使用 Subversion 来管理我们的代码。

搜索完所有文件后,我想删除临时缓存。听起来很简单,对吧?

由于某种原因,我的所有 .svn 目录都不会从缓存中删除。他们使应用程序崩溃。

由于某些原因(此处太深,无法深入),我必须使用临时文件夹,因此出于政治原因,仅“扫描原始文件”是不可能的。

我可以进入资源管理器并删除它们。没问题。没有警告。只是删除。但代码因“访问 {file} 被拒绝”而崩溃。我对此一无所知,因此将不胜感激。

虽然为了您的理智,我已经稍微简化了函数,但代码真的就是这么简单。

List<string> tmpCacheManifest = new List<string>();
string oldRootPath = "C:\\some\\known\\directory\\";
string tempPath = "C:\\temp\\cache\\";

foreach (string file in ListOfFilesToScan)
{
    string newFile = file.Replace(oldRootPath, tempPath);

    // This works just fine.
    File.Copy(file, newFile);

    tmpCacheManifest.add(newFile);
}

//    ... do some stuff to the cache to verify what I need.


// Okay.. I'm done.. Delete the cache.
foreach (string file in tmpCacheManifest)
{
   // CRASH!
   File.Delete(file);
}

* 更新 *:异常是 UnauthorizedAccessException。文本是“访问路径 'C:\temp\cache\some-sub-dirs\.svn\entries' 被拒绝。”

它发生在 XP、XP-Pro 和 Windows 7 下。

* 更新 2 * 我的验证都没有尝试查看颠覆文件。不过,我确实需要它们。这是政治废话的一部分。我必须证明每个文件都被复制了......无论它是否被扫描。

我意识到 File.Delete 的常见嫌疑人是什么。我意识到 UnauthorizedAccessException 是什么意思。我没有访问权限。这是不费吹灰之力的。但我只是复制了文件。我如何访问该文件?

* 更新 3 * 答案在“只读”标志中。这是我用来修复它的代码:

    foreach (string file in ListOfFilesToScan)
{
    string newFile = file.Replace(oldRootPath, tempPath);

    // This works just fine.
    File.Copy(file, newFile);

    //// NEW CODE ////
    // Clear any "Read-Only" flags
    FileInfo fi3 = new FileInfo(fn);
    if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    {
        fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly));
    }



    tmpCacheManifest.add(newFile);
}

//    ... do some stuff to the cache to verify what I need.

【问题讨论】:

  • 有什么例外?可能存在文件锁定。
  • File.Delete 可以抛出至少七种不同的异常类型。你要的是哪一个?
  • @Roboto,你不是说:WTE吗? TCBAFL?
  • “对缓存做一些事情”是否保留了任何文件,而不是正确关闭它们?
  • 乔恩,你也删除了一些文字,这是想要的吗?

标签: c# file-access


【解决方案1】:

据我所知,Subversion 将其 .svn 子目录中的文件标记为只读。

在删除文件之前尝试重置只读属性。我真的不知道任何 C#,但一个快速的谷歌建议这可能会解决问题:

File.SetAttributes(file, FileAttributes.Normal);

【讨论】:

  • 我已经对此进行了测试,到目前为止,在所有建议中,这是唯一真正导致异常的建议!
  • 好电话!我没有考虑过“只读”。但是,它仍然会引发异常。我真的要在这里抨击一些东西。 =)
  • 明白了!!最后......第二次崩溃是由于另一个奇怪的问题,而不是这个问题。
【解决方案2】:

我看到的唯一问题是这部分:

// ... do some stuff to the cache to verify what I need.

如果您打开文件却忘记关闭它,您仍然拥有对它的独占访问权限,因此以后无法删除它。

【讨论】:

  • 同意。如果您正在处理FileStream 对象,请确保在它们上调用Close(它调用Dispose)。更好的办法是简单地将它们包装在 using 块中。
  • 这不会是原因 - 如果你这样做,那么你会阻止其他进程删除文件,但是如果同一个进程试图删除文件,那么没有问题,因为句柄/锁是属于同一进程。我已经对此进行了测试,它不会导致异常。
【解决方案3】:

听起来您无权删除文件...

system.io.file.delete

上面的链接说你在什么时候得到UnauthorizedAccessException

调用者没有所需的权限。

-或-

path 是一个目录。

-或-

path 指定了一个只读文件。

就是其中之一。

【讨论】:

  • 他必须有权删除文件,因为他首先有权创建文件。
  • 好吧,他自己说这是被抛出的异常,我不知道如何。
【解决方案4】:

听起来像是权限问题。一个棘手的问题,因为如果 File.Copy 已经工作,您显然具有写访问权限....

我唯一能想到的是该文件仍然在某处打开了一个句柄(正如其他人可能在您的 对缓存中做一些事情部分所建议的那样)。

【讨论】:

  • 他必须有权删除文件,因为他首先有权创建文件。
【解决方案5】:

首先:“崩溃”意味着异常,对吧?哪一个?你能抓住它并展示它吗?

第二件事:您正在复制颠覆存储库,尽管您不关心颠覆元数据?这就是 svn export 的意义所在(目标中没有 .svn 目录)。

第一个问题的答案是您真正需要提供的。也许有些东西抓住了 .svn 并锁定了一些文件。 TortoiseSVN 也许(给你漂亮的覆盖图标..)?

【讨论】:

    【解决方案6】:

    如果文件夹包含只读文件,Directory.Delete 不会删除它并引发您遇到的异常。对于此页面的未来访问者,我找到了一个简单的解决方案,它不需要我们递归所有文件并更改它们的只读属性:

    Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 
    

    (稍微改变一下,不要立即触发 cmd 窗口,这在整个互联网上都可用)

    【讨论】:

      【解决方案7】:

      不明白你想做什么,但是如何将其更改为 777 或 775。:-/

      编辑:

      注意到您在 Windows 上。您必须更改权限。不知道windows是怎么做到的:-/

      【讨论】:

        猜你喜欢
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        相关资源
        最近更新 更多