创建文件时System.UnauthorizedAccessException

时间:2013-04-12 14:55:43

标签: c# exception

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

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?该链接讨论了类似的问题,但我无法使用其中列出的建议。

感谢您花时间看看这个。

4 个答案:

答案 0 :(得分:5)

你的道路很奇怪:"我的文件"目录必须是" C:\ Users \ MyName \ Documents \"

您可以使用环境以便轻松纠正:

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

[...]
    }
}

答案 1 :(得分:3)

一些可能的原因:

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

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

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

答案 2 :(得分:1)

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

的根目录

答案 3 :(得分:0)

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