我的函数读取 blob 后如何删除它

问题描述 投票:0回答:2

我创建了一个 blob 触发的 Azure 函数应用程序,它从 TSV 文件中获取数据并将其拆分,然后将数据写入 SQL 数据库。

读取文件后,我想将其从 blob 容器中删除。 我目前正在学习,这是我的第一个 C# 代码,所以我希望你能帮助我并具体说明。 我查看了文档

CloudBlockBlob blob = CloudBlobContainer.GetBlockBlobReference(???????);
blob.DeleteIfExists();

但我似乎不知道该放什么在这里

这是我的完整功能。如果您能帮我找到在哪里插入删除命令,我将不胜感激:)

using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using System.Diagnostics;
using System;
using System.Data.SqlClient;
using System.Linq;
using Azure.Storage.Blobs;
using Microsoft.WindowsAzure.Storage.Blob;

namespace FileProcessor
{
    public static class FileProcessorFn
    {
        [FunctionName("FileProcessorFn")]
        public static async Task Run([BlobTrigger("import/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, TraceWriter log)
        {

            log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
            if (myBlob.Length > 0)
            {

                using (var reader = new StreamReader(myBlob))
                {
                    var lineNumber = 1;
                    var line = await reader.ReadLineAsync();

                    var raceID = 0;
                    while (line != null)
                    {
                        if (lineNumber == 1 )
                        {
                            var fileName = name.Substring(0, name.Length - 4);
                            var races = fileName.Split('-');
                            var item2 = new Race
                            {
                                Race_Name = races[0],
                                Race_Track = races[1],
                                Race_Sequence = races[2],
                                Race_Date = races[3]
                            };

                            using (var context = new GokartDbContext())
                            {

                                context.Races.Add(item2);
                                log.Info("new race added with the name: " + item2.Race_Name + " and the date: " + item2.Race_Date + " with Success!");
                                await context.SaveChangesAsync();
                                //context.GetValidationErrors();
                                //context.SaveChanges();


                                raceID = context.Races.Select(p => p.RaceId).Max();
                            }
                        }
                        if (raceID > 0 )
                        { 
                            await ProcessLine(name, line, lineNumber, log, raceID);
                            line = await reader.ReadLineAsync();
                        }
                        lineNumber++;
                    }
                }
            }

            CloudBlockBlob blob = CloudBlobContainer.GetBlockBlobReference(image/{ name});
            blob.DeleteIfExists();

        }


        private static async Task ProcessLine(string name, string line, int lineNumber, TraceWriter log, int raceID)
        {
            if (string.IsNullOrWhiteSpace(line))
            {
                log.Warning($"{name}: {lineNumber} is empty.");
                return;
            }

            if (lineNumber == 1) 
            {
                log.Warning($"File header detected! Skipping....");
                return;

            }
            
            //var fileName = name.Substring(0, name.Length -4);
            //var races = fileName.Split('-');


            var x_GPS_Longitudinal_Acceleration = "";
            var x_Gyroscope_Y_Axis = "";
            var x_Accelerometer_X_Axis = "";
            var x_GPS_Speed = "";
            var x_Temperatur_1 = "";
            var x_Retning = "";
            var x_Vertikalt_DOP = "";
            var x_GPS_Lateral_Acceleration = "";
            var x_Temperatur_fra_Barometer = "";
            var x_RPM = "";
            var x_Humidity = "";
            var x_Gyroscope_Z_Axis = "";
            var x_Intern_Temperatur = "";
            var x_Lufttryk = "";
            var x_Laengdegrad = "";
            var x_Acceleeerometer_Z_Akse = "";
            var x_Rat_Vinkel = "";
            var x_GPS_Afstand = "";
            var x_Batteri_Voltage = "";
            var x_Vertical_Acceleration = "";
            var x_Positions_DOP = "";
            var x_Height = "";
            var x_Breddegrad = "";
            var x_Horisontal_DOP = "";
            var x_Gyroscope_X_Axis = "";
            var x_Accelerometer_Y_Akse = "";

            var parts = line.Split('\t');

            if (parts.Length > 6)
            {
                x_GPS_Longitudinal_Acceleration = parts[5];
                x_Gyroscope_Y_Axis = parts[6];
                x_Accelerometer_X_Axis = parts[7];
                x_GPS_Speed = parts[8];
                x_Temperatur_1 = parts[9];
                x_Retning = parts[10];
                x_Vertikalt_DOP = parts[11];
                x_GPS_Lateral_Acceleration = parts[12];
                x_Temperatur_fra_Barometer = parts[13];
                x_RPM = parts[14];
                x_Humidity = parts[15];
                x_Gyroscope_Z_Axis = parts[16];
                x_Intern_Temperatur = parts[17];
                x_Lufttryk = parts[18];
                x_Laengdegrad = parts[19];
                x_Acceleeerometer_Z_Akse = parts[20];
                x_Rat_Vinkel = parts[21];
                x_GPS_Afstand = parts[22];
                x_Batteri_Voltage = parts[23];
                x_Vertical_Acceleration = parts[24];
                x_Positions_DOP = parts[25];
                x_Height = parts[26];
                x_Breddegrad = parts[27];
                x_Horisontal_DOP = parts[28];
                x_Gyroscope_X_Axis = parts[29];
                x_Accelerometer_Y_Akse = parts[30];
            }

            //var item2 = new Race
            //{
            //    Race_Name = races[0],
            //    Race_Track = races[1],
            //    Race_Sequence = races[2],
            //    Race_Date = races[3]
            //};

            var item = new RaceData
            {
                RaceForeignKey = raceID,
                Start_Date = parts[0],
                Start_Time = parts[1],
                Lap_Number = parts[2],
                Session_Time = parts[3],
                Lap_Time = parts[4],
                GPS_Longitudinal_Acceleration = x_GPS_Longitudinal_Acceleration,
                Gyroscope_Y_Axis = x_Gyroscope_Y_Axis,
                Accelerometer_X_Axis = x_Accelerometer_X_Axis,
                GPS_Speed = x_GPS_Speed,
                Temperatur_1 = x_Temperatur_1,
                Retning = x_Retning,
                Vertikalt_DOP = x_Vertikalt_DOP,
                GPS_Lateral_Acceleration = x_GPS_Lateral_Acceleration,
                Temperatur_fra_Barometer = x_Temperatur_fra_Barometer,
                RPM = x_RPM,
                Humidity = x_Humidity,
                Gyroscope_Z_Axis = x_Gyroscope_Z_Axis,
                Intern_Temperatur = x_Intern_Temperatur,
                Lufttryk = x_Lufttryk,
                Laengdegrad = x_Laengdegrad,
                Acceleeerometer_Z_Akse = x_Acceleeerometer_Z_Akse,
                Rat_Vinkel = x_Rat_Vinkel,
                GPS_Afstand = x_GPS_Afstand,
                Batteri_Voltage = x_Batteri_Voltage,
                Vertical_Acceleration = x_Vertical_Acceleration,
                Positions_DOP = x_Positions_DOP,
                Height = x_Height,
                Breddegrad = x_Breddegrad,
                Horisontal_DOP = x_Horisontal_DOP,
                Gyroscope_X_Axis = x_Gyroscope_X_Axis,
                Accelerometer_Y_Akse = x_Accelerometer_Y_Akse
            };
            

            using (var context = new GokartDbContext())
            {

                //context.Races.Add(item2);
                //log.Info("new race added with the name: " + item2.Race_Name + " and the date: " + item2.Race_Date + " with Success!");
                context.RaceDatas.Add(item);
                log.Info($"{name}: {lineNumber} inserted task: \"{item.Start_Date}\" with id: {item.Id}.");

                
                await context.SaveChangesAsync();

            }
        }
    }
}

我想删除之后的 blob 的原因是因为该函数多次读取该文件。当它发生时,我会超时,因为处理数据需要超过 5 分钟。可能这就是它多次启动的原因。

有没有办法这样写,这样过程会更快? TSV 文件有时可以容纳多达 100.000 行。

期待对此的一些建议 罗宾

c# azure-functions azure-blob-storage
2个回答
0
投票

如果您查看 MSFT API

GetBlockBlobReference
方法,它接受
blobName
作为参数。

所以理想情况下,您已经从函数的参数中获得了名称。你就可以做

CloudBlockBlob blob = CloudBlobContainer.GetBlockBlobReference(name);
blob.DeleteIfExists();

0
投票

这个问题出现在谷歌搜索上,我花了很长时间才找到合适的答案

在BlobTrigger中可以映射到BlobClient而不是Stream,并使用.Delete方法。

这在文档的用法中列出,只是没有在任何示例中使用 https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python-v2%2Cisolated-process%2Cnodejs-v4%2Cextensionv5&pivots=programming-language -csharp

我使用 Function 的 .net8 名称而不是 FunctionName 进行编写,但我认为这在以前的版本中仍然有效。

[Function("FileProcessorFn")]
public static async Task Run([BlobTrigger("import/{name}", Connection = "AzureWebJobsStorage")]BlobClient myBlob, string name, TraceWriter log)
    {
    var stringContent = myBlob..DownloadContent().Value.Content.ToString();

    myBlob.DeleteIfExists();
}
© www.soinside.com 2019 - 2024. All rights reserved.