【问题标题】:Is it possible to read File from same folder where Azure function exists是否可以从存在 Azure 函数的同一文件夹中读取文件
【发布时间】:2018-09-10 20:53:05
【问题描述】:

在我的 Azure C# 函数中,我需要读取一个 .txt 文件。我在 Visual Studio 中制作 .txt 文件并将其设置为“始终复制”。

现在我正在使用这段代码来读取文件

var dir = System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetEntryAssembly().Location);

var path = System.IO.Path.Combine(dir, "twinkle.txt");

此代码不起作用。当我打开文件夹时 dir 的值。它把我带到这个目录 ""C:\Users{username}\AppData\Local\Azure.Functions.Cli\1.0.9""

如何在 Azure 函数中存储一个简单的 txt 文件。或者我需要 Azure 存储。

我还能做些什么来完成这项工作。

显示已复制文件的更新

【问题讨论】:

  • 将该文件作为资源嵌入到程序集中。
  • @tchelidze 我正在检查,谢谢你的想法。
  • @tchelidze 是的,它正在工作。谢谢

标签: c# azure azure-storage azure-functions


【解决方案1】:

这里是如何到达正确的文件夹:

public static HttpResponseMessage Run(HttpRequestMessage req, ExecutionContext context)
{
    var path = System.IO.Path.Combine(context.FunctionDirectory, "twinkle.txt");
    // ...
}

这会将您带到包含function.json 文件的文件夹。如果你需要去bin文件夹,你可能需要上一层,然后追加bin

// One level up
Path.GetFullPath(Path.Combine(context.FunctionDirectory, "..\\twinkle.txt"))

// Bin folder
Path.GetFullPath(Path.Combine(context.FunctionDirectory, "..\\bin\\twinkle.txt"))

【讨论】:

  • 我不相信我在启动时可以访问ExecutionContext。还有其他方法吗?
  • 我遇到了同样的问题@BillNoel,我已经在下面发布了解决该问题的答案。
  • 您可以将ExecutionContext context 作为参数添加到函数的Run 方法中。
  • context.FunctionAppDirectory 允许您访问应用程序根文件夹中的任何内容 context.FunctionDirectory 仅允许您访问功能特定目录
  • 这仅适用于 Windows(如果有效)
【解决方案2】:

对于像我这样无权访问ExecutionContext 的人,因为我们必须读取Startup 中的文件。

var binDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var rootDirectory = Path.GetFullPath(Path.Combine(binDirectory, ".."));

///then you can read the file as you would expect yew!
File.ReadAllText(rootDirectory + "/path/to/file.ext");

另外值得注意的是,Environment.CurrentDirectory 可能在本地环境中工作,但在部署到 Azure 时将无法工作。

也适用于函数内部。

Reference

【讨论】:

  • 对于包含 FirebaseAdmin 功能所需的 Google.json 文件非常有用!谢谢,路易!
  • 想知道这对每个人都有什么作用。我看到的执行程序集目录是一个临时的 ASP.NET 位置,配置文件当然不存在那里。 "D:\local\Temporary ASP.NET Files\root\80e1a0b8\1c033853\assembly\dl3\dc0956b6\"。
  • 嗯,这确实很奇怪,也许值得查看我在答案中包含的参考资料@PrasadKorhale
  • 如果我在文件夹中有文件它不起作用,它必须直接放在根文件夹下
  • @PrasadKorhale,因为我认为您正在部署源代码(而不是构建的程序集),并且您的项目正在 Functions App 的托管上编译。
【解决方案3】:

这是一个有用的链接:https://github.com/Azure/azure-functions-host/wiki/Retrieving-information-about-the-currently-running-function

有可能是硬编码的方式:

File.ReadAllText("d:\home\site\wwwroot\NameOfYourFunction" + "/path/to/file.ext");

【讨论】:

  • 这听起来很酷但硬编码的代码很糟糕。如果 Azure 突然将 Function 存储在其他地方怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2021-04-16
  • 2011-01-21
  • 2020-10-31
相关资源
最近更新 更多