访问程序自己的目录

时间:2013-06-14 23:08:45

标签: c# winforms c#-4.0

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

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

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

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

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

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

那么如何在不强迫用户以管理员身份运行的情况下,让这样的东西工作呢?

3 个答案:

答案 0 :(得分: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()重载之一。

答案 1 :(得分:4)

在现代操作系统中,文件夹C:\ program files(x86)受OS写保护。如果不使用管理帐户,则无法在此处创建子文件夹(在这种情况下,除非您禁用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);

答案 2 :(得分:1)

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