1

这是一个非常简单的问题。

注意:我确信人们已经在某处发现并发布了同样的问题,但我无法找出正确的搜索词来找到它。

好的,这是我的问题。假设我的程序存储在C:\Program Files (x86)\MyProgram\Program.exe. 现在在程序中,它基本上是

Directory.CreateDirectory(Application.StartUpPath + "\\Files")

所以基本上,这将在与程序本身相同的文件夹中创建一个名为 Files 的目录。假设我必须在该位置创建文件夹,因此不能选择使用不同的位置。

所以真正的问题是,如果它位于 c:\Program Files 目录中,当我尝试创建文件夹时,我的程序会“拒绝访问”。

那么我怎样才能在不强制用户以管理员身份运行它的情况下让这样的东西工作呢?

4

3 回答 3

7

如果它在 Windows 7 中,如果 UAC 被提升,您将无法修改 c:\Program Files 中的任何内容,而无需通过“以管理员身份运行”来根植自己。

由于 Windows 是一个多用户操作系统,存储任何特定于用户的内容都会导致灾难。

您的程序放置数据的正确位置是在适当的特殊文件夹中,您可以通过以下任一方式获取/创建

// user-specific application data is stored here
string userSpecificAppDataDirectory = Environment.GetFolderPath(
                                        SpecialFolder.ApplicationData ,
                                        SpecialFolderOption.Create
                                        ) ;

// application data common to all users is stored here
string commonAppDataDirectory = Environment.GetFolderPath(
                                  SpecialFolder.CommonApplicationData ,
                                  SpecialFolderOption.Create
                                  ) ;

或其他Environment.GetFolderPath()重载之一。

于 2013-06-14T23:31:00.163 回答
4

在现代操作系统中,文件夹 C:\program files (x86) 受操作系统写保护。如果不使用管理帐户,您将无法在此处创建子文件夹(在这种情况下,除非您禁用 UAC,否则您将被要求确认此操作)。所以正确的做法是在另一个地方创建你的数据文件夹。最好的选择是使用以下方法提取的CommonApplicationData文件夹:

 Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

或 SpecialFolder.ApplicationData 枚举,如果您的数据应该由应用程序的当前用户区分,或者 SpecialFolder.MyDocuments 如果这些文件由您的用户生成并且需要由其他程序自由打开(或需要包含在备份)

在您获得操作系统提供的用于存储应用程序数据的特殊文件夹后,请记住为您的应用程序创建一个子文件夹,并根据您的要求创建其他子文件夹

// In Win7 this usually resolves to C:\ProgramData, but do not use this folder 
string appCommon = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);

// This resolves to C:\programdata\your_app_name\files
string appData = Path.Combine(appCommon, "your_app_name", "files");

// This will create all directories in the specified path one by one....
if(!Directory.Exists(appData)) Directory.CreateDirectory(appData);
于 2013-06-14T23:19:30.540 回答
1

您可以尝试在安装过程中创建所需的任何文件或文件夹。我不确定如果使用第三方安装创建者你会发现什么成功,但我的理解是,通过Visual Studio 部分选项卡中的Application Files...按钮添加的项目然后具有某种固有授予应用程序使用的访问权限。PublishProject Properties

于 2013-06-14T23:11:22.217 回答