【问题标题】:System.UnauthorizedAccessException was unhandledSystem.UnauthorizedAccessException 未处理
【发布时间】:2013-12-07 16:41:25
【问题描述】:

我收到拒绝访问异常。我该如何解决这个问题?

这是一个例外:

System.UnauthorizedAccessException 未处理 HResult=-2147024891 Message=拒绝访问路径“c:\message.txt”。
来源=mscorlib

代码如下:

    public static void WriteToFile(string s)
    {
        fs = new FileStream("c:\\message.txt",
        FileMode.Append, FileAccess.Write);
        sw = new StreamWriter(fs);
        sw.WriteLine(s);
        sw.Flush();
        sw.Close();
        fs.Close();
    }

编辑:如果我以管理员身份运行 vs2012,它可以工作,但有没有办法或理由以普通用户身份运行?

这行得通:

    public static void WriteToFile(string s)
    {
        fs = new FileStream(@"C:\Users\KristjanBEstur\Documents\message.txt",
        FileMode.Append, FileAccess.Write);
        sw = new StreamWriter(fs);
        sw.WriteLine(s);
        sw.Flush();
        sw.Close();
        fs.Close();
        File.Delete(@"C:\Users\KristjanBEstur\Documents\message.txt");
    }

【问题讨论】:

  • 该文件可能是只读的,或者您没有写入该文件的权限。
  • @driis 文件不存在。
  • 在这种情况下,您可能没有对该目录的写入权限。
  • 如果您启用了 UAC 并且您没有以“管理员”身份运行您的应用程序,您通常无权直接访问系统驱动器的根目录。
  • 写入根 c:\ 需要管理员权限。创建其他文件夹并在那里写入文件。例如 c:\temp\message.txt

标签: c# file access-denied unhandled-exception file-access


【解决方案1】:

双击app.manifest文件,如果app.manifest不存在右键单击您的项目,添加->新项目->应用程序清单文件然后替换此行

<requestedExecutionLevel level="asInvoker" uiAccess="false" />

有了这个

<requestedExecutionLevel level="requireAdministrator" uiAccess="true" />

它将以管理员权限运行您的应用程序。

【讨论】:

    【解决方案2】:

    如果你想访问根目录,你可能需要在管理员模式下运行你的项目

    您可以通过将其添加到应用清单来做到这一点

    <requestedExecutionLevel level="requireAdministrator" uiAccess="true"/>
    

    【讨论】:

      【解决方案3】:

      我不确定到底是什么都可能抛出UnauthorizedAccessException

      不过有一个想法...您尝试直接在c: 驱动器中创建文件,系统策略有时不允许这样做。为了排除故障,请尝试在您可以访问的其他位置创建文件,例如 My Documents

      【讨论】:

        【解决方案4】:

        在访问该文件之前,您需要将FileFileAtrributes 属性设置为Normal

        试试这个:

        public static void WriteToFile(string s)
            {
                String path=@"c:\message.txt";
                if(File.Exists(path))
                {
                File.SetAttributes(path, FileAttributes.Normal);
                fs = new FileStream(path,
                FileMode.Append, FileAccess.Write);
                sw = new StreamWriter(fs);
                sw.WriteLine(s);
                sw.Flush();
                sw.Close();
                fs.Close();
                }
                else
                {
                MessageBox.Show("File not Found!");
                }
            }
        

        【讨论】:

        • 我使用您的代码时出现了一个新异常:System.IO.FileNotFoundException 未处理 HResult=-2147024894 消息=找不到文件'c:\message.txt'。源=mscorlib 文件名=c:\message.txt
        • @somethingSomething: 现在可以确定 c: drive 中没有文件 message.txt,你检查了吗?
        • @somethingSomething:我已经编辑了检查文件是否存在的答案,试试看,请告诉我结果。
        • 如果文件不存在,我希望创建该文件。你会怎么做?
        • 如果我以管理员身份运行 vs2012,我的代码可以工作。这就是问题所在。
        【解决方案5】:

        只是添加到 Mujahed 的答案(我还不能发表评论),如果您只是想以管理员权限运行,则不需要 uiAccess="true"。将此选项设置为 true 可能会让您有些头疼(例如,您可能无法在调试模式下运行项目。)

            <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
        

        【讨论】:

          猜你喜欢
          • 2015-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-01
          • 1970-01-01
          • 2018-08-23
          相关资源
          最近更新 更多