Environment.CurrentDirectory vs System.IO.Directory.GetCurrentDirectory
我正在写一个.Net WinForms并且不断在DEBUG和RELEASE配置之间切换,并且我需要一些配置才能到达的文件。
我想要做的是将文件放在BIN文件夹中的公共目录中,这样看起来像这样:
MyProject/Bin/CommonFiles MyProject/Bin/Debug MyProject/Bin/Release
我正在考虑使用以下内容来访问文件:
System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory).FullName
我的问题是,如果这是危险的,因为从我读过的内容, System.IO.Directory.GetCurrentDirectory
可能会因用户在一个打开的文件对话框中选择一个新的当前目录而改变。
我是否应该使用以下内容:
System.IO.Directory.GetParent(Environment.CurrentDirectory).FullName
或者有一个更好的方式来到/Bin
文件夹,所以我可以从那里或一个普遍接受的方式/位置移动存储程序通常需要达到的文件和更容易引用的方式(可能是工作的东西与任何类型的应用程序,而不仅仅是WinForms)?
您可以使用System.Reflection.Assembly.GetExecutingAssembly().Location
获取应用程序的.exe位置。
string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location; string exeDir = System.IO.Path.GetDirectoryName(exePath); DirectoryInfo binDir = System.IO.Directory.GetParent(exeDir);
我会这样做:
-
为项目中的文件创建一个子文件夹,例如“CommonFiles”。
-
将配置文件放在此文件夹中。 将其属性设置为:
-
构建行动=内容
-
复制到输出目录=始终复制(或者:如果更新则复制)
-
-
每次构建应用程序时,文件都将被复制到bin \ Debug \ CommonFiles或bin \ Release \ CommonFiles。 您可以将它们引用为:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat");
虽然大多数答案确实看起来确实有效, 但经过相当多的调整后,Joe提供的解决方案被certificate是我情况的最佳解决方案。
首先,我采用的最终解决方案:
- 创建了一个
Common Files
目录(在我的情况下,与我的Bin
目录处于同一级别,但这不是必需的,它只是解释我稍后会提供的代码如何工作) - 编辑我的
.vbproj
(或`,csproj’)文件,将该目录中的所有文件(包括子目录)设置为我项目的额外资源文件 - 对我的
.vbproj
文件进行了第二次编辑,以便在构建时将所有这些资源文件复制到bin \ Debug或bin \ Release目录。
其次,我是如何学会这样做的:
- Joes解决方案上面
- 此链接显示如何能够将通配符添加到.vbproj / .csproj文件中,以便您可以一次添加完整目录。
- 这个答案显示了如何将文件复制到我的\ Bin目录
最后,我的解决方案:
- 我打开了我的project.vbproj文件
- 在
行上方 ,我添加了一个新的ItemGroup
,如下所示:
这将加载所有文件(包括所有子文件夹)并为我提供Build Action CommonFiles
-
在
行下面,我添加了以下几行:$(PrepareForRunDependsOn);CopyCommonFiles
这将在构建时将CommonFiles
构建操作中的文件复制到bin \ Debug / bin \ Release目录中。
这就是我做到的……
如果您认为我应该使用其他方式或其他方式,那么任何评论/想法都非常感激)….
这个
如果您有配置数据等,我会将它们存储在%Appdata%目录中。 将可能更改的文件放入安装目录并不是一个好主意,并且自Windows Vista以来是禁止的。 配置数据应存储在%Appdata%文件夹中,该文件夹是一个特殊文件夹。 不要将其路径硬编码到您的程序中 – 来自国外或32/64位窗口的用户将遇到严重问题。
你可以在这里看到如何访问Appdata-Folder的好主意: 如何使用C#创建appdata文件夹
以下代码来自http://msdn.microsoft.com/en-us/library/ms229654(v=vs.90).aspx
String strAppDir = Path.GetDirectoryName( Assembly.GetExecutingAssembly().GetName().CodeBase); String strFullPathToMyFile = Path.Combine(strAppDir, "fileName.txt"); MessageBox.Show(String.Format("Path to the application is: '{0}'." + "Full path to the file in the application folder is: '{1}'", strAppDir, strFullPathToMyFile));