在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();
}
谢谢。需要任何信息,只需询问即可。
答案 0 :(得分:3)
您收到此错误,因为您的应用程序未以管理员身份运行,并试图写入仅适用于管理员的程序文件。
除非您正在编写安装程序,否则您的应用程序将永远不需要以管理员身份运行,因此它可以写入程序文件。程序文件不适用于应用程序向其写入运行时数据。这是供管理员安装应用程序的安全位置。此过程可保护受信任的应用程序文件免遭恶意更改。
您应该不将数据写入ProgramFiles目录。 Windows具有多种用于向其中写入数据的目录,例如%TEMP%,%APPDATA%和%LOCALAPPDATA%。
答案 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表示以下两种情况之一:
对于 Directory.CreateDirectory ,它表示:
我不会在Program Files或Program File x(86)下创建目录。建议在具有许可权的C:\ Users \下创建。
如果仍然需要在程序文件中创建,请以管理员身份运行Visual Studio或更改清单,如下所示:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />