【问题标题】:Correct File Path within C# Console ApplicationC# 控制台应用程序中的正确文件路径
【发布时间】:2013-03-28 21:47:16
【问题描述】:

谁能告诉我如何获得文件 data.xml 的正确文件路径?这是文件所在的位置:

这是我的 C# 代码,用于检查提供的路径是否存在文件:

public class Parser
{
    static void Main(string[] args)
    {
        Console.WriteLine(File.Exists("App_Data/data.xml"));
        Console.Read();
    }
}

我不断得到 False,这意味着这样的文件不存在。所以到目前为止我尝试过的文件路径包括:

"~/App_Data/data.xml"
"/App_Data/data.xml"
"App_Data/data.xml"

如果这是一个 Web 应用程序,我会知道该怎么做,通过使用 HttpContext 并获取文件。但由于这是一个控制台应用程序,我不知道。

在相关说明中,控制台应用程序和可执行应用程序有什么区别?我是否正确,没有区别,因为如果控制台应用程序具有 Main 方法,它可以是可执行应用程序?

谢谢

【问题讨论】:

    标签: c#-4.0 console-application relative-path filepath


    【解决方案1】:

    您还可以将 data.xml 添加到您的输出构建目录。您需要右键单击该文件并选择Copy if newerCopy always 作为Copy to output directory option

    然后你可以使用以下内容:

    Console.WriteLine(File.Exists("App_Data/data.xml")); // Should print True
    

    但是,如果您希望 data.xml 发生变化,那么只需指向项目外部某处的完整路径(假设 App_Data/data.xml 被复制到 C:/Temp)然后:

    Console.WriteLine(File.Exists("C:/Temp/App_Data/data.xml")); // Prints True
    

    此外,对于您与控制台和可执行应用程序相关的其他问题,exe 可以是不同的应用程序类型,例如控制台或 wpf 或 winforms(这是 Visual Studio 对这些进行分组的方式)。

    【讨论】:

    • 我刚做了,又跑了一遍,结果还是 False :(
    • 构建操作是否设置为内容?
    • 您对澄清可执行应用程序位投了赞成票。是的,我将其设置为内容并始终复制。
    • 尝试从 Visual Studio 菜单重建您的项目。我刚刚运行了代码,它在调试和发布模式下对我有用。如果您导航到项目路径并查看 bin/Debug 文件夹,您应该在那里看到一个带有 data.xml 的 App_Data 目录
    • 这取决于。如果您希望 data.xml 成为该文件,那么我的答案不是您想要的。以我建议的方式添加该文件或任何资源将作为您的 exe 的一部分嵌入。最好将此文件放在项目之外的某个位置并引用该文件的完整路径
    【解决方案2】:

    获取当前工作目录:

    Directory.GetCurrentDirectory() + "/App_Data/data.xml";
    

    重要提示:App_Data 必须与您的应用程序位于同一目录中。

    获取data.xml 文件的最佳方式是将其与您的应用程序一起携带或保存,例如在您用户的“主”目录中(或在 Windows 8 下调用的任何目录)。

    【讨论】:

    • 嗯,我在 Visual Studio 2012 中,这就是我按 F5 按钮运行我的应用程序的地方。所以所有项目文件都将位于 C:/Users/Me/My Documents/Visual Studio 2012/Projects/XML Parser/XML Parser .. etc 你知道,项目在 VS 中的默认位置。
    • 据我所知,应用程序已构建并放入 build\release 目录或某处。打开命令行并浏览您的应用程序目录并检查 .exe 和 App_Data 目录的位置。
    • 这里是App_Data folder is
    • 将文件从 bin 复制到 XML Parser 或将 App_Data 目录复制到 bin 并运行它。
    • 如果我们将它与@Leon 的答案结合起来,确实是一个很好的答案。 Leon 提到要更改 App_Data 文件夹内文件的“复制到输出目录”属性
    【解决方案3】:

    您可以嵌入文件并使用反射来获取它。

    Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream("file name");
    XmlDocument d = new XmlDocument();
    steamReader sr = new StreamReader(s);
    d.LoadXml(sr.ReadToEnd());
    r.Close();
    

    查看这篇文章。它展示了如何使用反射嵌入和获取文件:https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.getmanifestresourcestream?view=netframework-4.8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2012-04-21
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多