C# 访问程序';自己的目录

C# 访问程序';自己的目录,c#,winforms,c#-4.0,C#,Winforms,C# 4.0,这是一个非常简单的问题 注意:我确信人们已经在某个地方找到并发布了相同的问题,但我无法找出正确的搜索词来找到它 好吧,这是我的问题。 假设我的程序存储在C:\ProgramFiles(x86)\MyProgram\program.exe。 现在在程序中,它基本上是这样的 Directory.CreateDirectory(Application.StartUpPath + "\\Files") 所以基本上,这将在程序本身所在的文件夹中创建一个名为Files的目录。 假设我必须在该位置创建文件夹

这是一个非常简单的问题

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

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

Directory.CreateDirectory(Application.StartUpPath + "\\Files")
所以基本上,这将在程序本身所在的文件夹中创建一个名为Files的目录。
假设我必须在该位置创建文件夹,因此使用其他位置不是一个选项

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


那么,我如何才能在不强制用户以管理员身份运行的情况下让类似的东西工作呢?

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

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

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

 Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
如果数据应由应用程序的当前用户区分,则使用SpecialFolder.ApplicationData enum;如果这些文件由用户生成并需要由其他程序自由打开(或需要包含在备份中),则使用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);

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

 Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)
如果数据应由应用程序的当前用户区分,则使用SpecialFolder.ApplicationData enum;如果这些文件由用户生成并需要由其他程序自由打开(或需要包含在备份中),则使用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);

如果是在Windows 7中,如果UAC是elevate,则如果不通过“以管理员身份运行”,您将无法修改c:\Program文件中的任何内容

由于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
                                  ) ;

或者另一个
环境。GetFolderPath()
重载。

如果它在Windows 7中,如果UAC是elevate,如果不通过“以管理员身份运行”,您将无法修改c:\Program文件中的任何内容

由于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()
重载。

对于这种情况,您可以使用commonuserpath或isolatedstorage。由于您试图在Program Files目录中写入,因此您需要以管理员身份运行应用程序或将其保存在其他位置。程序文件是受保护的文件夹,只有管理员可以对其进行写入。“使用其他位置不是选项”。为什么?请解释一下你为什么做出这个非常危险的决定。事实上,这是可行的,我只是问这个问题,想知道如果你做不到该怎么办。对于这些事情,你可以使用commonuserpath或isolatedstorage。既然你正试图在Program Files目录中编写,您需要以管理员身份运行应用程序,或者将其保存到其他位置。程序文件是受保护的文件夹,只有管理员可以对其进行写入。“使用其他位置不是选项”。为什么?请解释一下你为什么会做出这个非常危险的决定。事实上,它会起作用的,我只是问这个问题,想知道如果你做不到该怎么办。说得好,但是,或者你回答了这个问题,或者你把它作为一个评论。对不起。。我是新来的,至少作为一个贡献者。我不知道该在哪里对这个问题发表评论,但我会尽量避免重复这个错误。没问题。看看问题下面,你会看到一个链接“添加评论”。嗯。。我没有看到这个选项,只有“共享”、“编辑”和“标记”。可能是因为我的新身份吗?我也看不出有什么帮助。此外,我的回复是否因为无益或提交不好而被降级??:/对不起,是的,你现在不能发表评论。看到他了吗