在搜索中了解有关streamreader的更多信息时,我遇到了这个问题 StreamReader path changes automatically 发布#2
Hans Passant
var exedir = Path.GetDirectory(Assembly.GetEntryAssembly().Location);
var path = Path.Combine(exedir, @"Config\launcher.txt"); using (var
reader = new StreamReader(path)) {
//... }
现在我理解"永远不会硬编码文件"在delphi中,我能够根据目录中的文件指定自定义文件路径,即。
读取目录中的所有文件名,用户选择文件名,然后我读取文件的内容
Delphi,我刚刚使用了一个字符串并将文件名添加到最后,这与上面的代码有什么不同,并且上面有不同的方法吗?
和btw。有人可以更详细地解释一下,使用的方法和变量以及为什么(我还是c#的新手)
答案 0 :(得分:0)
我认为汉斯在这里说的是,如果您希望文件与您的应用程序代码相关,那么相对于您的应用程序代码 expliclty看起来。不要依赖当前目录作为应用程序的基本位置,因为这不能保证(并且可以在应用程序执行期间更改)。所以代码的作用是:
Main
方法的程序集),并查看该程序集的文件位置:Assembly.GetEntryAssembly().Location
var exedir = Path.GetDirectory(...);
var path = Path.Combine(exedir, @"Config\launcher.txt");
using (var
reader = new StreamReader(path)) ...
答案 1 :(得分:0)
GetEntryAssembly返回,根据文档:
默认情况下可执行流程的程序集 应用程序域,或者是第一个可执行文件 由AppDomain.ExecuteAssembly执行。
Location属性返回程序集的完整路径。所以
Assembly.GetEntryAssembly().Location
是可执行文件的完整路径。在Delphi中,您可以编写ParamStr(0)或Application.ExeFileName。
Path.GetDirectory剥离文件名并离开目录。在Delphi中,您将使用ExtractFilePath。
Path.Combine simple连接两个路径组件,必要时添加路径分隔符。在Delphi中,你可以使用IOUtils单元中的TPath.Combine。
因此,问题中的代码构造了一个名为
的文件的完整路径<exedir>\Config\launcher.txt
包含主可执行程序集的目录在哪里,当然只在运行时才知道。
在Delphi和C#中完成任务之间没有什么特别的不同。要使用任一语言构造相同的路径,您可以采用模数语法/方法名称差异完全相同的步骤。
您可能习惯假设工作目录是包含可执行程序集的目录。如果是这样,就失去这种习惯。工作目录对于控制台应用程序是有意义的,对于这样的应用程序,它可以被视为程序的输入。但是不要指望它在GUI程序中是稳定的。并且永远不要假设工作目录包含可执行文件。这个假设是无效的。
另一方面,也许你真的想要一个相对于工作目录的路径。在这种情况下,只需提供文件名,让系统负责其余的工作。