C# Environment.CurrentDirectory vs System.IO.Directory.GetCurrentDirectory
我正在编写一个.Net WinForms,并不断在调试和发布配置之间切换,并且有一些文件需要在两种配置中都可以访问 我想做的是将这些文件放在BIN文件夹的一个公共目录中,这样看起来就像这样: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
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
- 编辑我的
(或`,csproj')文件,将该目录中的所有文件(包括子目录)设置为我的项目的额外资源文件.vbproj
- 对我的
文件进行第二次编辑,以便在生成时将所有这些资源文件复制到我的bin\Debug或bin\Release目录.vbproj
其次,我是如何学会这样做的:
- 演示如何将通配符添加到.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文件夹有点犹豫,因为许多用户只需要使用这个程序一次