我正在写一个.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
OR 是否有更好的方法可以到达/Bin
文件夹,这样我就可以从那里移动或者通常接受的方式/位置来存储程序通常需要访问的文件更容易引用的方法(可能是与任何类型的应用程序而不仅仅是WinForms一起使用的东西)?
答案 0 :(得分:8)
您可以使用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);
答案 1 :(得分:5)
我会这样做:
为项目中的文件创建一个子文件夹,例如“CommonFiles”。
将配置文件放在此文件夹中。将其属性设置为:
构建操作=内容
复制到输出目录=始终复制(或者可能:如果更新则复制)
每次构建应用程序时,文件都将被复制到bin \ Debug \ CommonFiles或bin \ Release \ CommonFiles。您可以将它们引用为:
Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat");
答案 2 :(得分:3)
虽然大多数答案确实似乎有效,the solution offered by Joe above经过相当多的调整后,证明是我情况的最佳解决方案。
首先,我采用的最终解决方案:
Common Files
目录(在我的情况下,与我的Bin
目录处于同一级别,但这不是必需的,它只是解释我稍后会提供的代码如何工作) .vbproj
(或`,csproj')文件,将该目录中的所有文件(包括子目录)设置为我项目的额外资源文件.vbproj
文件进行了第二次编辑,以便在构建时将所有这些资源文件复制到bin \ Debug或bin \ Release目录。其次,我是如何学会这样做的:
最后,我的解决方案:
<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
,我添加了一个新的ItemGroup
,如下所示: <ItemGroup> <CommonFiles Include="Common Files\**" /> </ItemGroup>
这会加载所有文件(包括所有子文件夹)并为我提供构建操作CommonFiles
在<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />
行下面,我添加了以下几行:
<PropertyGroup> <PrepareForRunDependsOn>$(PrepareForRunDependsOn);CopyCommonFiles</PrepareForRunDependsOn> </PropertyGroup>
<Target Name="CopyCommonFiles"> <Copy SourceFiles="@(CommonFiles)" DestinationFolder="$(OutDir)\%(RecursiveDir)" SkipUnchangedFiles="true"/> </Target>
这将在构建时将CommonFiles
构建操作中的文件复制到bin \ Debug / bin \ Release目录中。
这就是我做到的......
如果您认为我应该使用其他方式或其他任何方式,那么任何评论/想法都非常感激。)
此
答案 3 :(得分:1)
如果您有配置数据等,我会将它们存储在%Appdata%目录中。将可能更改的文件放入安装目录并不是一个好主意,并且自Windows Vista以来是禁止的。配置数据应存储在%Appdata%文件夹中,该文件夹是一个特殊文件夹。不要将其路径硬编码到您的程序中 - 来自国外的用户或32 / 64bit Windowses会出现严重问题。
您可以在此处看到如何访问Appdata-Folder的好主意: How to create appdata folder with C#
答案 4 :(得分:0)
以下代码来自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));