Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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# 从启动项目中找不到的文件中读取_C#_Asp.net Mvc_File - Fatal编程技术网

C# 从启动项目中找不到的文件中读取

C# 从启动项目中找不到的文件中读取,c#,asp.net-mvc,file,C#,Asp.net Mvc,File,我的web解决方案有许多项目 启动项目名为“Bob” “鲍勃”指的是“吉尔”项目 在“吉尔”里面,有一个我想读的文件。“Gill/One/Two/hi.txt” 我在Bob中有一些代码,它调用了试图访问上述txt文件的“Gill”项目中的一些代码: File.ReadAllText(@"~/One/Two/hi.txt") 找不到该文件 我已将文件生成标记为 内容 我已将复制到输出目录标记为: 如果更新,请复制 访问该文件的方法是什么?我相信~是由.NET webform使用的,并且只有

我的web解决方案有许多项目

  • 启动项目名为“Bob”
  • “鲍勃”指的是“吉尔”项目
  • 在“吉尔”里面,有一个我想读的文件。“Gill/One/Two/hi.txt”
我在Bob中有一些代码,它调用了试图访问上述txt文件的“Gill”项目中的一些代码:

File.ReadAllText(@"~/One/Two/hi.txt")
找不到该文件


我已将文件生成标记为

内容

我已将复制到输出目录标记为:

如果更新,请复制


访问该文件的方法是什么?

我相信
~
是由.NET webform使用的,并且只有
服务器.MapPath允许()

您可以通过
newsystem.IO.FileInfo(@“One/Two/hi.txt”)获取该文件

尝试文件路径作为

var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin\\One\\Two\\hi.txt");
设定 构建操作:无

复制到输出:始终复制(或复制,如果更新)

您需要

  • 确保文件已复制到您的网站。如果它不存在,你就无法阅读
  • 正确地组合文件路径。执行代码不直接知道
    ~
    作为路径字符,您必须将其转换为
    System.IO
    命名空间中任何类型的网站的根路径,如
    文件或
    路径。最好的方法是使用
  • 代码:

    标记为内容并复制到外部项目中引用的文件(这些文件反过来又被web项目引用)的内容将相对于web应用程序的
    bin
    文件夹进行复制。在这种情况下,向根路径添加
    bin
    ,如下所示:

    var root = System.Web.Hosting.HostingEnvironment.MapPath("~/bin");
    

    如果已将文件设置为复制到输出目录,则该文件将位于应用程序的bin目录中

    稍微改变一下我的答案,你可以这样做

    var root = System.Web.Hosting.HostingEnvironment.MapPath("~/bin");
    var filePath = System.IO.Path.Combine(root, "One", "Two", "hi.txt");
    if(System.IO.File.Exists(filePath)) {
        var allText = System.IO.File.ReadAllText(filePath);
    }
    

    它将解析应用程序的
    bin
    目录,您的文件将在该目录中扎根。

    要访问该文件,您需要将其复制到启动项目可执行目录,或在配置中存储指向该文件所在目录的路径。或者,您可以将其作为资源嵌入并以这种方式访问它。启动项目所需的只是对其他项目输出的DLL的引用,这样它就不会看到其他内容文件。“较新时复制”只是复制到相对于当前项目的目录中。我以前有过解决方案,有一个专门的“资源”项目,其任务是将资产发布到右侧place@Charleh这使我可以访问dll
    Assembly.getExecutionGassembly()
    现在怎么办?“找不到路径'C:\\One\\Two\\hi.txt'的一部分。”我更新了jimmy,我想这是因为开始时的斜杠。这段代码试图查看“Bob”目录(启动项目)而不是“Gill”目录(文件所在的项目)@Jimmyt1988-一切都与根web应用程序相关。因此,如果您在另一个项目中有一个文件要包含,则应该相对于发布路径(web应用)包含该文件。从这一点开始构建您的路径,因为web应用程序没有项目概念(Gill/Bob),这是一个纯Visual Studio概念的解决方案。我理解这一点,但是,我希望该文件存在于我的项目中。这就是为什么我的问题是在运行应用程序时如何访问文件。我认为复制到输出应该在这方面有所帮助。将其放入输出目录应允许您保存该文件。@Jimmyt1988-当您从web应用程序中包含外部项目的内容时,这些内容将相对于启动项目
    bin
    文件夹放置。所以
    Bob\bin\Gill\relativeFilePath
    relativeFilePath
    取决于您指定的其他文件夹。这不是一个非常方便的构造,通常项目中包含的静态内容(如.txt、.xls、.mdb等文件)会直接在web应用程序项目中引用。如果您将
    ~/bin
    ,它会起作用。谢谢你几乎让我到达那里,编辑你的答案,我会接受:)
    var root = System.Web.Hosting.HostingEnvironment.MapPath("~/bin");
    var filePath = System.IO.Path.Combine(root, "One", "Two", "hi.txt");
    if(System.IO.File.Exists(filePath)) {
        var allText = System.IO.File.ReadAllText(filePath);
    }