代码之家  ›  专栏  ›  技术社区  ›  Jerry

对新创建的文件执行UnauthorizedAccessException

  •  10
  • Jerry  · 技术社区  · 15 年前

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

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

    出于某种原因,所有的.svn目录都不会从缓存中删除。他们让应用程序崩溃。.@p>

    出于某些原因(太深,无法进入此处),我必须使用temp文件夹,因此出于政治原因,“scan the original file”(扫描原始文件)是不可能的。

    我可以进入浏览器并删除它们。没问题。没有警告。只是删除。但代码崩溃,“访问文件”被拒绝。“我对这个很在行,所以任何帮助都会得到感激。

    虽然为了您的理智,我稍微简化了一点函数,但代码实际上是关于这个简单的。

    <> <代码> >

    list<string>tmpcachemaifest=new list<string>();
    string oldrootpath=“c:\\some\\known\\directory\\”;
    string temppath=“c:\\temp\\cache\\”;
    
    foreach(listofilestoscan中的字符串文件)
    {
    string newfile=file.replace(oldrootpath,temppath);
    
    //这很好用。
    file.copy(文件,新文件);
    
    tmpcachemaifest.add(newfile);
    }
    
    /…对缓存做一些事情来验证我需要什么。
    
    
    /好的。我完了。删除缓存。
    foreach(tmpcachemaifest中的字符串文件)
    {
    /崩溃!
    文件。删除(文件);
    }
    

    *update*.:异常为UnauthorizedAccessException。文本为“拒绝访问路径”c:\temp\cache\some sub dirs \.svn\entries。

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

    *update 2*.我的验证都没有尝试查看Subversion文件。不过,我确实需要它们。这是政治废话的一部分。我必须证明每个文件都是复制的…不管扫描与否。

    我知道通常的嫌疑犯是什么。我意识到未经授权的AccessException意味着什么。我没有权限。这是一个很简单的方法。但我只是复制了文件。我如何才能访问文件?

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

    <> <代码> >

    foreach(listofilestoscan中的字符串文件)
    {
    string newfile=file.replace(oldrootpath,temppath);
    
    //这很好用。
    file.copy(文件,新文件);
    
    ////新代码////
    //清除所有“只读”标志
    fileinfo fi3=新fileinfo(fn);
    if((fi3.attributes&fileattributes.readonly)==fileattributes.readonly)
    {
    fi3.attributes=(fileattributes)(convert.toint32(fi3.attributes)-convert.toint32(fileattributes.readonly));
    }
    
    
    
    tmpcachemaifest.add(newfile);
    }
    
    /…对缓存做一些事情来验证我需要什么。
    < /代码> 
    
    

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

    出于某种原因,所有的.svn目录都不会从缓存中删除。他们破坏了应用程序。

    出于某些原因(这里太深了,无法进入),我不得不使用temp文件夹,因此出于政治原因,“扫描原始文件”是不可能的。

    我可以进入浏览器并删除它们。没问题。没有警告。只是删除。但是代码崩溃了,“访问文件”被拒绝了,“我对这个已经无计可施了,所以任何帮助都会得到感激。

    虽然为了您的理智,我稍微简化了函数,但代码实际上是关于这个简单的。

    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 *我的任何验证都没有试图查看Subversion文件。不过,我确实需要它们。这是政治废话的一部分。我必须证明每个文件都是复制的…不管扫描与否。

    我知道通常的嫌疑犯是什么。我意识到未经授权的AccessException意味着什么。我没有权限。这是一个很简单的方法。但我只是复制了文件。我怎么能不是有权访问该文件吗?

    *更新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 回复  |  直到 12 年前
        1
  •  12
  •   Martin B    15 年前

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

    删除文件之前,请尝试重置只读属性。我真的不知道任何一个C,但是一个快速的谷歌暗示这可能会起作用:

    File.SetAttributes(file, FileAttributes.Normal);
    
        2
  •  2
  •   Femaref    15 年前

    我看到的唯一问题是:

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

    如果确实打开了文件,但忘记了关闭它,那么您仍然拥有对它的独占访问权,因此以后不能删除它。

        3
  •  2
  •   Matt Ellen Bipin Vayalu    15 年前

    听起来你没有删除文件的权限…

    system.io.file.delete

    上面的链接说 UnauthorizedAccessException 什么时候?

    调用方没有所需的权限。

    -或-

    路径是一个目录。

    -或

    路径指定了只读文件。

    就是其中之一。

        4
  •  1
  •   James    15 年前

    听起来像是权限问题。但这很棘手,因为如果file.copy已经工作了,那么显然您有写访问权……

    我能想到的唯一一件事就是文件在某个地方仍然有一个打开的句柄(正如其他人在您的 对缓存做些事情 部分)。

        5
  •  0
  •   Benjamin Podszun    15 年前

    首先,“撞车”是一个例外,对吧?哪一个?你能抓住它并展示它吗?

    第二件事:您正在复制Subversion存储库,尽管您不关心Subversion元数据?这就是SVN导出的目的(目标中没有.svn目录)。

    第一个问题的答案是你真正需要提供什么。可能有什么东西抓取了.svn并锁定了一些文件。Tortoissesvn可能(给你很好的叠加图标…)

        6
  •  0
  •   Piyush Soni    12 年前

    如果文件夹包含只读文件,则directory.delete不会将其删除并引发异常。对于本页的未来访问者,我找到了一个简单的解决方案,它不要求我们重复浏览所有文件并更改其只读属性:

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

    (稍微改变一下,不要瞬间触发一个命令窗口,这个窗口在互联网上随处可见)

        7
  •  -2
  •   EpicDewd    15 年前

    不知道你想做什么,但是把它改成777或775怎么样。- -

    编辑:

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