【问题标题】:System.UnauthorizedAccessException while creating a file创建文件时出现 System.UnauthorizedAccessException
【发布时间】:2013-04-05 04:06:57
【问题描述】:

我正在尝试编写代码以便记录错误消息。我正在尝试用日期命名文件,并希望为每一天创建一个新的日志文件。经过一番环顾后,我得到了以下代码......

class ErrorLog
{
    public void WriteErrorToFile(string error)
    {
        //http://msdn.microsoft.com/en-us/library/aa326721.aspx refer for more info
        string fileName = DateTime.Now.ToString("dd-MM-yy", DateTimeFormatInfo.InvariantInfo);

        //@ symbol helps to ignore that escape sequence thing
        string filePath = @"c:\users\MyName\mydocuments\visual studio 2012\projects\training\" +
                            @"discussionboard\ErrorLog\" + fileName + ".txt";

        if (File.Exists(filePath))
        {
           // File.SetAttributes(filePath, FileAttributes.Normal);
            File.WriteAllText(filePath, error);
        }
        else
        {
            Directory.CreateDirectory(filePath);
           // File.SetAttributes(filePath, FileAttributes.Normal)
           //Throws unauthorized access exception
            RemoveReadOnlyAccess(filePath);
            File.WriteAllText(filePath, error);
        }
    }

    public static void RemoveReadOnlyAccess(string pathToFile)
    {
        FileInfo myFileInfo = new FileInfo(pathToFile);
        myFileInfo.IsReadOnly = false;
        myFileInfo.Refresh();
    }

    /*Exception thrown:
     * UnAuthorizedAccessException was unhandled.
     * Access to the path 'c:\users\anish\mydocuments\visual studio 2012\
     * projects\training\discussionboard\ErrorLog\04\12\2013.txt' is denied.
     */
}

我找到了一个讨论过类似问题但使用 File.SetAttrributes(filePath, FileAttributes.Normal) 也没有帮助 RemoveReadOnlyAccess (包含在上面的代码中)。当我检查文件夹的属性时,它已标记为只读,但即使我勾选它,它也会再次出现。我检查了文件夹的权限,除了我无法更改的特殊权限外,一切都是允许的。 任何关于我应该如何进行的建议将不胜感激。 Why is access to the path denied? 该链接讨论了类似的问题,但我无法使用那里列出的建议来解决问题。

感谢您花时间看这个。

【问题讨论】:

  • 这是服务还是应用程序?目录的用户权限可能与它有关 - 您能否提供有关基础架构的更多信息?如果是服务,是作为域帐户还是本地帐户运行?
  • @Charleh - 这是 Windows 窗体应用程序的一部分。我打算在我所有的 catch 块中调用这个方法。关于用户权限,如果它没有权限,它也不应该创建一个文件夹。它在指定位置创建了一个文件夹名称“ErrorLog”。谢谢。

标签: c# exception


【解决方案1】:

一些可能的原因:

  • 您的应用未在允许访问该路径/文件的帐户下运行
  • 文件正被其他进程锁定以进行写入(或者也可能读取)

第一种情况可以通过检查进程在哪个帐户下运行并验证该帐户是否具有适当的权限来解决。

其他情况可以通过检查是否有其他进程锁定文件来解决(例如,使用“WhosLocking”或“ProcessExplorer”等工具)

【讨论】:

  • 感谢您的回复。我很确定我使用的是具有管理员权限的用户帐户。如果它没有权限,是不是也应该创建文件夹失败?它创建了文件夹,但没有创建文件。那是应用程序必须创建的新文件,所以我认为这也排除了被锁定的可能性,不是吗?
【解决方案2】:

你的路径很奇怪:“我的文档”目录必须是“C:\Users\MyName\Documents\”

您可以使用 Environment 来轻松纠正它:

String myDocumentPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

请注意,它将访问运行您的 exe 的用户的“我的文档”文件夹。

第二个错误,CreateDirectory 在参数中必须有路径,而不是文件。像你一样使用将创建一个带有文件名的子目录。所以你不能用这个名字创建文件!

试试这个:

String fileName = DateTime.Now.ToString("d", DateTimeFormatInfo.InvariantInfo);

String filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
    + @"\visual studio 2012\projects\training\discussionboard\ErrorLog\";
String fileFullName = filePath + fileName + ".txt";

    if (File.Exists(fileFullName ))
    {
        File.WriteAllText(fileFullName , error);
    }
    else
    {
        Directory.CreateDirectory(filePath);

[...]
    }
}

【讨论】:

  • 你提到之后,我觉得有点奇怪。但是,当我像在上面那样指定路径时,它能够创建以前不存在的“ErrorLog”文件夹,问题是在该文件夹中创建文件时。知道我是否正确地进行了文件创建部分吗?
  • 我试过你所说的,这对我来说很有意义,但仍然是同样的错误。另外,我最初将日期转换为“dd/mm/yy”中的字符串,并且文件名中不允许使用“/”,所以我认为这可能是问题所在,我将其更改为“mm-dd-yy”但这也无济于事。知道如何检查/更改我正在使用的用户帐户的权限吗?
  • 成功了!非常感谢,你太棒了:)。似乎问题出在我使用的路径名的某个地方,当我将其更改为您完成 Environment.GetFolderPath 的方式时......它起作用了!赞赏! :) 太糟糕了,因为我的声誉,我现在不能投票给你的答案:(
【解决方案3】:

我必须以管理员身份运行我的应用程序才能写入 c: 中的受保护文件夹。例如,如果在 Visual Studio 中调试您的应用程序,请确保右键单击“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe”并选择“以管理员身份运行”。然后从那里打开您的解决方案。我的应用程序试图写入 c:\

的根目录

【讨论】:

    【解决方案4】:

    检查您的防病毒软件,它可能会阻止文件创建。

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多