如何在asp.net核心写入静态文件?

时间:2017-05-23 21:31:05

标签: asp.net asp.net-core

我正在编写一个示例来写入静态文件(.txt)。

我试过了:

    public IActionResult Index()
    {
        string dt = DateTimeOffset.Now.ToString("ddMMyyyy");

        string path = Path.Combine(_environment.WebRootPath, $"Logs/{dt}");

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        string filePath = Path.Combine(_environment.WebRootPath, $"Logs/{dt}/{dt}.txt");

        using (FileStream fs = System.IO.File.Create(filePath))
        {
            AddText(fs, "foo");
            AddText(fs, "bar\tbaz");
        }

        return View();
    }

    private void AddText(FileStream fs, string value)
    {
        byte[] info = new System.Text.UTF8Encoding(true).GetBytes(value);
        fs.Write(info, 0, info.Length);
    }

但它创建了wwwroot文件夹内的所有内容,而不是项目的根目录。

[temp.deduct.partial]

我想在这里创建文本文件:

1

我可以在哪里编辑?

更新

这是我定义_environment

的方式
public class HomeController : Controller
{
    private readonly IHostingEnvironment _environment;

    public HomeController(IHostingEnvironment environment)
    {
        _environment = environment;
    }
}

2 个答案:

答案 0 :(得分:4)

问题是您使用IHostingEnvironment.WebRootPath来确定根文件夹。此属性是包含可Web服务的应用程序内容文件的目录的绝对路径 - 即wwwroot文件夹。相反,您应该使用IHostingEnvironment.ContentRootPath属性,该属性将为您提供包含应用程序的目录的绝对路径。

例如:

var contentRoot = _environment.ContentRootPath;
var webRoot = _environment.WebRootPath;

//contentRoot = "C:\Projects\YourWebApp"
//webRoot     = "C:\Projects\YourWebApp\wwwroot"

您可以使用WebRootPath并导航到其父目录,但如果由于某种原因您选择将wwwroot移到其他位置,您的代码可能会中断。使用一种方法可以更好地在每个项目中为您提供正确的路径。

答案 1 :(得分:1)

而不是

string filePath = Path.Combine(_environment.WebRootPath, $"Logs/{dt}/{dt}.txt");

使用

var folder = new System.IO.DirectoryInfo(_environment.WebRootpath).Parent.FullName;
var filePath = Path.Combine(folder, $"Logs/{dt}/{dt}.txt");