对新创建的文件的UnauthorizedAccessException

时间:2010-01-05 16:18:48

标签: c# file-access

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

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

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

由于原因(进入这里太深了),我必须使用临时文件夹,因此出于政治原因“扫描原始文件”是不可能的。

我可以进入资源管理器并删除它们。没问题。没有警告。只是删除。但代码崩溃,“访问{file}被拒绝”。我对这个问题感到满意,所以任何帮助都会受到赞赏。

虽然我为了你的理智而将函数简化为LITTLE,但代码真的很简单。

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);
}

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 * 我的验证甚至没有ATTEMPTS来查看subversion文件。但是,我确实需要它们。这是政治废话的一部分。我必须证明每个文件都被复制了...它是否被扫描过。

我意识到File.Delete的常见嫌疑。我意识到UnauthorizedAccessException意味着什么。我没有访问权限。这是一个明智的选择。但我只是复制了文件。我怎样 NOT 可以访问该文件?

*更新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.

7 个答案:

答案 0 :(得分:12)

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

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

File.SetAttributes(file, FileAttributes.Normal);

答案 1 :(得分:2)

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

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

如果您打开文件并忘记关闭它,您仍然可以独占访问它,因此以后无法删除它。

答案 2 :(得分:2)

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

system.io.file.delete

以上链接表示您在以下时间获得UnauthorizedAccessException

  

来电者没有所需的权限。

     

- 或 -

     

path是一个目录。

     

- 或 -

     

path指定了只读文件。

这是其中之一。

答案 3 :(得分:1)

听起来像权限问题。虽然如果File.Copy已经有效,你很明显有写访问权,但很棘手......

我唯一能想到的是文件仍然在某个地方打开了句柄(正如其他人在你的做一些东西到缓存部分中所建议的那样)。

答案 4 :(得分:0)

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

第二件事:你是在复制subversion存储库,虽然你不关心subversion元数据?这就是svn export的意义(目标中没有.svn目录)。

第一个问题的答案是你真正需要提供的。也许某事抓住了.svn并锁定了一些文件。 TortoiseSVN也许(给你很好的叠加图标......)?

答案 5 :(得分:0)

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

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

(稍微更改一下,不要暂时触发cmd窗口,这可以在互联网上找到)

答案 6 :(得分:-2)

不明白你想做什么,但是把它修改为777或775怎么样。: - /

编辑:

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

相关问题