Environment.CurrentDirectory与System.IO.Directory.GetCurrentDirectory

时间:2013-11-14 15:22:12

标签: c# .net vb.net

我正在写一个.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一起使用的东西)?

5 个答案:

答案 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目录。

其次,我是如何学会这样做的:

  • Joes solution above
  • This link显示了如何能够将通配符添加到.vbproj / .csproj文件中,以便您可以一次添加完整目录。
  • This answer,其中显示了如何将文件复制到我的\ Bin目录

最后,我的解决方案:

  • 我打开了我的project.vbproj文件
  • <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));
相关问题