9

我正在编写一个 .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)?

4

5 回答 5

13

您可以使用 .exe 获取应用程序的 .exe 位置System.Reflection.Assembly.GetExecutingAssembly().Location

string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeDir = System.IO.Path.GetDirectoryName(exePath);
DirectoryInfo binDir = System.IO.Directory.GetParent(exeDir);
于 2013-11-14T15:31:35.497 回答
5

尽管大多数答案似乎确实有效,但上面 Joe 提供的解决方案经过相当多的调整,被证明是适合我情况的最佳解决方案。


首先,我采用的最终解决方案:

  • 创建了一个Common Files目录(在我的情况下,与我的目录在同一级别Bin,但这不是必需的,它只是解释我稍后将放置的代码如何工作)
  • 编辑我的.vbproj(或 `,csproj')文件以将该目录(包括子目录)中的所有文件设置为我的项目的额外资源文件
  • 对我的文件进行了第二次编辑,以.vbproj在构建时将所有这些资源文件复制到我的 bin\Debug 或 bin\Release 目录。

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


最后,我的解决方案:

  • 我打开了我的 project.vbproj 文件
  • 这条线上<Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />,我添加了一个新ItemGroup的外观,如下所示:

<ItemGroup> <CommonFiles Include="Common Files\**" /> </ItemGroup>

这会加载所有文件(包括所有子文件夹)并为我提供构建操作CommonFiles

  • 在line下方<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 目录中。

我就是这样做的......

非常感谢任何评论/想法)如果您认为我应该使用其他方式或其他方式)....

这个

于 2013-11-14T22:05:39.967 回答
5

我会这样做:

  • 为项目中的文件创建一个子文件夹,例如“CommonFiles”。

  • 将配置文件放在此文件夹中。将它们的属性设置为:

    • 构建动作 = 内容

    • 复制到输出目录 = 始终复制(或者可能:如果较新则复制)

  • 每次构建应用程序时,这些文件将被复制到 bin\Debug\CommonFiles 或 bin\Release\CommonFiles。您可以将它们引用为:

    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat");
    
于 2013-11-14T15:39:15.690 回答
1

如果您有配置数据等。我会将它们存储在 %Appdata% 目录中。将可能更改的文件放入安装目录不是一个好主意,并且从 Windows Vista 开始被禁止。配置数据应该存储在 %Appdata% 文件夹中,这是一个特殊的文件夹。不要将其路径硬编码到您的程序中 - 来自外国或 32/64 位 Windows 的用户将遇到严重问题。

您可以在这里看到如何访问 Appdata 文件夹的好主意: 如何使用 C# 创建 appdata 文件夹

于 2013-11-14T15:32:09.450 回答
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));
于 2013-11-14T15:33:10.703 回答