无法创建目录:System.UnauthorizedAccessException错误

时间:2019-01-10 23:00:22

标签: c#

在C#中使用文件和创建目录相对较新,但是我已经停留了一段时间。我收到以下错误: System.UnauthorizedAccessException:'对路径'C:\ Program Files \ Skyroom'的访问被拒绝。'

这是我的代码,以防万一:

if (File.Exists(@"C:\Program Files\Skyroom\gamedata.txt"))
            {
                Console.WriteLine("Game loading. Please wait..");
                Thread.Sleep(500);
                Console.Clear();
                Console.WriteLine("Game loading. Please wait...");
                Thread.Sleep(500);
                Console.Clear();
                Console.WriteLine("Game loading. Please wait.");
                Thread.Sleep(500);
                Console.Clear();
                Console.WriteLine("Game loading. Please wait..");
                Thread.Sleep(500);
                Console.Clear();
                Console.WriteLine("Game loading. Please wait...");
                Thread.Sleep(500);
                Console.Clear();

            }
            else
            {                
                Directory.CreateDirectory(@"C:\Program Files\Skyroom");
                File.Create(@"C:\Program Files\Skyroom\gamedata.txt");
                Main();
            }

谢谢。需要任何信息,只需询问即可。

3 个答案:

答案 0 :(得分:3)

您收到此错误,因为您的应用程序未以管理员身份运行,并试图写入仅适用于管理员的程序文件。

除非您正在编写安装程序,否则您的应用程序将永远不需要以管理员身份运行,因此它可以写入程序文件。程序文件不适用于应用程序向其写入运行时数据。这是供管理员安装应用程序的安全位置。此过程可保护受信任的应用程序文件免遭恶意更改。

您应该将数据写入ProgramFiles目录。 Windows具有多种用于向其中写入数据的目录,例如%TEMP%,%APPDATA%和%LOCALAPPDATA%。

Windows Environment Variables

答案 1 :(得分:1)

您的问题是运行应用程序所在的Windows用户没有权限访问文件夹C:\Program Files\Skyroom\

您有一些选择。一种是在创建目录时向用户授予读/写权限:

var skyroomDirectory = Directory.CreateDirectory(@"C:\Program Files\Skyroom");

DirectorySecurity security = skyroomDirectory.GetAccessControl();
security.AddAccessRule(new FileSystemAccessRule(@"MYDOMAIN\JohnDoe", 
                        FileSystemRights.Modify, 
                        AccessControlType.Allow));
skyroomDirectory.SetAccessControl(security);

File.Create(@"C:\Program Files\Skyroom\gamedata.txt");

使用适合您需要的AccessControlType。您应该使用执行必要任务所需的最少特权。 https://docs.microsoft.com/en-us/dotnet/api/system.security.accesscontrol.filesystemrights?view=netframework-4.7.2

另一个选择是将文件保存在用户有权访问的用户文件夹中。但是问题是用户会看到一个奇怪的文件,并且有可能将其删除。

答案 2 :(得分:1)

根据 File.Create ,UnauthorizedAccessException表示以下两种情况之一:

  1. 呼叫者没有所需的权限。 -或-
  2. 路径指定了一个只读文件。

对于 Directory.CreateDirectory ,它表示:

  1. 呼叫者没有所需的权限。

我不会在Program Files或Program File x(86)下创建目录。建议在具有许可权的C:\ Users \下创建。

如果仍然需要在程序文件中创建,请以管理员身份运行Visual Studio或更改清单,如下所示:

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