Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Environment.CurrentDirectory vs System.IO.Directory.GetCurrentDirectory_C#_.net_Vb.net - Fatal编程技术网

C# Environment.CurrentDirectory vs System.IO.Directory.GetCurrentDirectory

C# Environment.CurrentDirectory vs System.IO.Directory.GetCurrentDirectory,c#,.net,vb.net,C#,.net,Vb.net,我正在编写一个.Net WinForms,并不断在调试和发布配置之间切换,并且有一些文件需要在两种配置中都可以访问 我想做的是将这些文件放在BIN文件夹的一个公共目录中,这样看起来就像这样: MyProject/Bin/CommonFiles MyProject/Bin/Debug MyProject/Bin/Release 我在考虑使用以下内容访问文件: System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory

我正在编写一个.Net WinForms,并不断在调试和发布配置之间切换,并且有一些文件需要在两种配置中都可以访问

我想做的是将这些文件放在BIN文件夹的一个公共目录中,这样看起来就像这样:

MyProject/Bin/CommonFiles
MyProject/Bin/Debug
MyProject/Bin/Release
我在考虑使用以下内容访问文件:

System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory).FullName
System.IO.Directory.GetParent(Environment.CurrentDirectory).FullName
我的问题是,这是否危险,因为根据我所读的,
System.IO.Directory.GetCurrentDirectory
可能会因为用户在(比如)打开的文件对话框中选择新的当前目录而发生更改

我是否应该使用以下内容:

System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory).FullName
System.IO.Directory.GetParent(Environment.CurrentDirectory).FullName

是否有更好的方式进入
/Bin
文件夹,以便我可以从那里移动,或者有一种普遍接受的方式/位置来存储程序通常需要访问的文件,以及更容易引用的方式(可能是针对任何类型的应用而设计的,而不仅仅是WinForms)?

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

string exePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string exeDir = System.IO.Path.GetDirectoryName(exePath);
DirectoryInfo binDir = System.IO.Directory.GetParent(exeDir);

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

关于如何访问Appdata文件夹,您可以在此处看到: 以下代码来自


我会这样做:

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

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

    • 构建操作=内容

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

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

    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "CommonFiles\MyFile.Dat");
    

尽管大多数答案看起来确实有效,但经过一番调整后,证明是解决我这种情况的最佳方案


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

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

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

  • 演示如何将通配符添加到.vbproj/.csproj文件中,以便可以立即添加完整目录
  • 它显示了如何将文件复制到my\Bin目录

最后,我的解决方案:

  • 我打开了project.vbproj文件
  • 行上方,我添加了一个新的
    项目组
    ,如下所示:

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

  • 下面,我添加了以下几行:

    $(PrepareForRunDependsOn);复制公共文件

这将在生成时将文件从
CommonFiles
build操作复制到bin\Debug/bin\Release目录中

我就是这样做的

任何意见/想法都非常感谢)如果你认为我应该用另一种方式或其他方式)


如果程序集是卷影复制的,则assembly.Location包含被卷影复制后的位置。更好的解决方案是使用AppDomain.BaseDirectory:这似乎是最明智的想法。。。我们需要的所有这些文件以及所需的.dll。。。现在,我知道这可能看起来很奇怪,但可能在10个左右不同的目录中有大约50个左右的文件,我需要这样做(根据用户输入,它会打开一个特定的文件)。。。是否有一种方法可以一次更改整个目录的这些属性,或者我必须逐个文件执行此操作。。。或者,考虑到这些新的数据,你会推荐一种不同的方法吗??谢谢我认为这种技术适用于数量相对较少的只读配置文件,所有文件都存在于构建时。如果它们是读/写文件和/或用户可以添加其他文件,那么我不会这样做。相反,将文件放在bin文件夹外的适当位置(如果是读/写文件,则用户可以写入该文件夹),并使用包含文件的目录将配置设置添加到app.config。谢谢,Joe-它们不可写,只是保存到用户机上的模板。。。只是有很多不同的模板和不同的用途,所以在子文件夹中。。。。你还是会说用app.config来做这个??你认为最好怎么做(可能是@Tim的解决方案和您添加的建议/编辑???-再次感谢您的持续帮助!!Joe,我找到了一个解决方案来帮助您完成工作…我将它作为一个单独的解决方案发布,以向人们展示我所做的,但我确实认为,一旦我发现如何执行必要的任务,您就有了最好的解决方案…谢谢!!!这不是真正的配置数据-这是程序在运行时需要的更多文件…我对经常将它们复制到每个操作系统用户计算机上的appdata文件夹有点犹豫,因为许多用户只需要使用这个程序一次