1

在搜索以了解有关流读取器的更多信息时,我从 StreamReader 路径更改中发现了这一点,该更改自动 发布 #2

汉斯·帕桑特

var exedir = Path.GetDirectory(Assembly.GetEntryAssembly().Location);
var path = Path.Combine(exedir, @"Config\launcher.txt"); using (var
reader = new StreamReader(path)) {
    //... }

现在我了解了“从不硬编码文件”部分,在delphi中,我可以根据目录中的文件指定自定义文件路径,即。

读取一个目录下的所有文件名,用户选择一个文件名,然后我读取文件的内容

Delphi,我只是使用了一个字符串并将文件名添加到末尾,这与上面的代码有什么不同,上面有没有不同的方法?

顺便说一句。有人可以更详细地解释一下,使用的方法和变量以及原因(我还是 C# 新手)

4

2 回答 2

0

我认为 Hans 在这里所说的是,如果您希望文件与您的应用程序代码相关,那么expliclty 看起来相对于您的应用程序代码。不要依赖当前目录作为应用程序的基本位置,因为这不能保证(并且可以在应用程序执行期间更改)。所以代码的作用是:

  • 获取入口点程序集(具有Main在启动时执行的方法的程序集),并获取该程序集的文件位置:Assembly.GetEntryAssembly().Location
  • 从此文件路径获取目录:var exedir = Path.GetDirectory(...);
  • 构造一个相对于该目录的路径:var path = Path.Combine(exedir, @"Config\launcher.txt");
  • 根据最终路径创建阅读器:using (var reader = new StreamReader(path)) ...
于 2013-10-28T08:12:05.727 回答
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 程序中是稳定的。永远不要假设工作目录包含可执行文件。这个假设是不成立的。

另一方面,也许你真的想要一个相对于工作目录的路径。在这种情况下,只需提供文件名并让系统处理其余的事情。

于 2013-10-28T08:13:07.957 回答