我有一个由某些Blob创建触发的Azure函数,正在执行一些转换(主要是OCR),然后将结果再次写入Blob:
[FunctionName("Ocr")]
public static async Task Run([BlobTrigger("input/{name}")]CloudBlockBlob myBlob,[Blob("output/{name}_{DateTime}.txt", FileAccess.Write)] TextWriter resultTextFile, string name,ILogger log)
{
try
{
var ocrResult = await DoOcr(name);
// This only happens if no exception was thrown
await resultTextFile.WriteAsync(ocrResult.Text);
}
catch (Exception e)
{
log.LogError(e, $"Exception during processing. Cannot process document {name}");
}
}
这一切都很好,很好。但是,如果“ DoOcr()”函数内部出现问题,则会引发异常-并将其捕获到我的catch块中-函数结束,并在“ output / {name} _ {DateTime}”处创建一个空的新Blob。文本文件”。
从未调用“ WriteAsync()”,但是为什么仍创建该文件?如果在绑定中使用“ CloudBlockBlob”而不是“ TextWriter”,则不会发生。
正如凯尔(Kyle)所说TextWriter writer = new StreamWriter(stream);
。因此,当TextWriter
用作blob输出时,它将为指定路径上的指定文件初始化StreamWriter类的新实例。如果文件存在,则可以将其覆盖或附加。如果该文件不存在,则此构造方法将创建一个新文件。
当您将CloudBlockBlob用作blob输出时,它将CloudBlockBlob
使用该blob的绝对URI初始化该类的新实例,该URI读取为内存中流,然后转储到文件中。因此,如果流被中断,它将不会创建输出新文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句