【问题标题】:How do i get access to C:\Program Files\ in c#如何在 c# 中访问 C:\Program Files\
【发布时间】:2021-05-31 10:52:57
【问题描述】:

我想以比桌面更通用的方式保存我的文件。 所以我想在程序文件夹中创建自己的子文件夹,我可以用它来保存我的东西。 但是如果我尝试使用File.AppendAllText(@"C:\Program Files\MySubfolder\MyFile.txt,someString); 创建文件,我会得到“System.UnauthorizedAccessException”

我什至手动禁用了文件夹保护。 我的应用程序尚未编译,所以我无法以管理员身份运行它,可以吗? 每个程序如何使用此文件夹但我不能? 每次我做一个小改动并想要测试它时,我是否需要编译我的应用程序?

我真的很感激帮助,因为我现在坚持了几个小时

【问题讨论】:

  • 保存自己的文档的正确位置是 Document 文件夹。
  • How does every Program use this Folder but i cant? 没有表现良好的程序会写在那里,相反,他们会使用 AppData 或 Documents 或用户配置文件中的任何内容。
  • AppData 是另一个常见的地方。stackoverflow.com/a/64756445/920069

标签: c# windows admin subdirectory unauthorizedaccessexcepti


【解决方案1】:

尝试在 Program Files 中编写是一种非常糟糕的做法。此文件夹以及其他敏感文件夹受操作系统保护,以防止恶意代码隐藏在您的程序之间或防止不精通的用户弄乱已安装的程序。

如果您想在磁盘上写入您的私人资料,您可以使用这些文件夹

string folder = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
string myFolder = Path.Combine(folder, "MyReservedPath");
Directory.CreateDirectory(myFolder);  // if exists does nothing
string myFile = Path.Combine(myFolder, "MyPrivateData.txt");
File.WriteAllText(myFile, dataToWriteOnDisk);

CommonApplicationData 解析为 C:\programdata,此位置通常用于为使用它的任何用户存储程序所需的信息。

如果你想存储你的程序产生的一些数据,那么最好使用

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

还有很多其他可用的地方,只需查看Environment.SpecialFolder 枚举即可。

此代码将为您提供映射到系统中实际文件夹的所有内容的列表

foreach (Environment.SpecialFolder x in Enum.GetValues(typeof(Environment.SpecialFolder)))
    Console.WriteLine($"{x} = {Environment.GetFolderPath(x)}");

【讨论】:

  • 这看起来很有希望,我明天一定会试试这个。但是如果使用Program Files文件夹那么糟糕,为什么这么多主要软件都这样做呢?
  • Program Files 是你安装程序的地方,他们通常不会尝试在那里写。如果他们需要一些支持文件(动态配置、用户偏好等),他们会写入用户配置文件中的 programdata 或 appdata。如果您查看那里,您会发现很多由您安装的程序编写的东西
  • 当用户安装一个程序时很清楚这个事实,并且可以授予在那里写初始东西的权限。现在想象一下,如果某个病毒编写者能够用病毒替换一些众所周知的程序。这发生在过去,这是他们现在很难在那里写的原因之一
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多