C# 在sftp中遍历文件并存储到azure blob

C# 在sftp中遍历文件并存储到azure blob,c#,sftp,azure-storage-blobs,C#,Sftp,Azure Storage Blobs,基本上,我创建了一个azure webjob,它将循环通过一个sql表中的记录,该表具有sftp位置详细信息。对于每个sftp位置,使用sftpclient连接并读取文件夹中的所有文件。 对于每个文件,我连接到azure并将其存储在blob中 我已经在单个文件中完成了上述操作。但是我们希望以一种合适的面向对象的方式来做。不确定什么是正确的方法。我在设计模式方面没有太多经验,但如果有人能推荐一种正确的方法,我会很高兴的 如果有人能帮助我以正确的面向对象的方式实现这一点,我将不胜感激 谢谢

基本上,我创建了一个azure webjob,它将循环通过一个sql表中的记录,该表具有sftp位置详细信息。对于每个sftp位置,使用sftpclient连接并读取文件夹中的所有文件。 对于每个文件,我连接到azure并将其存储在blob中

我已经在单个文件中完成了上述操作。但是我们希望以一种合适的面向对象的方式来做。不确定什么是正确的方法。我在设计模式方面没有太多经验,但如果有人能推荐一种正确的方法,我会很高兴的

如果有人能帮助我以正确的面向对象的方式实现这一点,我将不胜感激

谢谢

            var azureBlob = AzureBlobStorage.Instance(StorageConnectionString, Containername);

            List<SftpLocationData> sftps = null;

            try
            {
                sftps = SftpLocationClient.GetSftpLocationDetails().ToList();
                if (sftps == null || !sftps.Any()) return;

            }
            catch (Exception ex)
            {
                LogMessage(string.Format("Error getting sftp details : {0}", ex.Message), log);
            }

            foreach (var fileClient in sftps.Select(sftp => new FileTransferClient(sftp)))
            {
                using (var sftpClient = fileClient.CreateClient())
                {
                    sftpClient.Connect();

                    var files = sftpClient.ListDirectory(path: fileClient.Data.Directory ?? ".").ToList();
                    if (files.Any())
                    {
                        var validFiles = files.Where(f => ext.Any(e => e == Path.GetExtension(f.Name))).ToList();
                        foreach (var file in validFiles)
                        {
                            var fileExists = azureBlob.FileExists(file.Name);
                            var blobUri = string.Empty;
                            var blobName = file.Name;
                            var fileImport = PopulateFileImportData(file);
                            if (fileExists)
                            {
                                int count = azureBlob.ListFiles(blobName);
                                blobName = (count == 0) ? blobName : String.Format("{0}_v{1}", blobName, count);
                                fileImport.Error = true;
                                fileImport.ErrorMsg = "Duplicate File";
                            }
                            fileImport.FileName = blobName;
                            try
                            {
                                var fileSaved = RbsClient.SaveFileImport(fileImport);

                                blobUri = azureBlob.UploadFile(fileSaved.FileName, sftpClient.OpenRead(file.FullName));

                                fileSaved.Archived = DateTime.Now;
                                RRClient.UpdateFile(fileSaved);
                            }
                            catch (Exception ex)
                            {
                                LogMessage(string.Format("Error saving fileimport detail : {0}", ex.Message), log);
                            }

                            if (fileImport.Error) continue;

                            IQueueGenerator queueGenerator = new QueueGenerator();

                            var queueName = queueGenerator.GetQueueName(
                                                blobName,
                                                fileClient.Data,
                                                blobUri);

                            if (string.IsNullOrEmpty(queueName)) continue;
                        }
                    }
                    sftpClient.Disconnect();
                }
            }
        }
        catch (Exception ex)
        {
            LogMessage(string.Format("Error occurred in processing pending altapay requests. Error : {0}", ex.Message), log);
        }
var azureBlob=AzureBlobStorage.Instance(StorageConnectionString,Containername);
列表sftps=null;
尝试
{
sftps=SftpLocationClient.GetSftpLocationDetails().ToList();
if(sftps==null | |!sftps.Any())返回;
}
捕获(例外情况除外)
{
LogMessage(string.Format(“获取sftp详细信息时出错:{0}”,例如Message),log);
}
foreach(sftps.Select中的var fileClient(sftp=>newfiletransferclient(sftp)))
{
使用(var sftpClient=fileClient.CreateClient())
{
sftpClient.Connect();
var files=sftpClient.ListDirectory(路径:fileClient.Data.Directory??).ToList();
if(files.Any())
{
var validFiles=files.Where(f=>ext.Any(e=>e==Path.GetExtension(f.Name)).ToList();
foreach(validFiles中的var文件)
{
var fileExists=azureBlob.fileExists(file.Name);
var blobUri=string.Empty;
var blobName=file.Name;
var fileImport=PopulateFileImportData(文件);
如果(文件存在)
{
int count=azureBlob.ListFiles(blobName);
blobName=(count==0)?blobName:String.Format(“{0}\u v{1}”,blobName,count);
fileImport.Error=true;
fileImport.ErrorMsg=“重复文件”;
}
fileImport.FileName=blobName;
尝试
{
var fileSaved=RbsClient.SaveFileImport(fileImport);
blobUri=azureBlob.UploadFile(fileSaved.FileName,sftpClient.OpenRead(file.FullName));
fileSaved.Archived=DateTime.Now;
RRClient.UpdateFile(文件保存);
}
捕获(例外情况除外)
{
LogMessage(string.Format(“保存文件导入详细信息时出错:{0}”,例如Message),log);
}
如果(fileImport.Error)继续;
IQueueGenerator queueGenerator=新的queueGenerator();
var queueName=queueGenerator.GetQueueName(
blobName,
fileClient.Data,
布洛布里);
如果(string.IsNullOrEmpty(queueName))继续;
}
}
sftpClient.Disconnect();
}
}
}
捕获(例外情况除外)
{
LogMessage(string.Format(“处理挂起的altapay请求时出错。错误:{0}”,例如Message),log);
}

您好,据我所知,您需要将文件/文件夹从FTP复制到azure blob存储

Step 1. Get list of SFTP locations
Step 2. Init Azure Blob Storage Connection
Step 3. Init SFTP
Step 4. Iterate Files in SFTP
Step 5. Store the file into Blob Storage
Step 6. Close SFTP connection
Step 7. Close Azure Blob Storage

您好,据我所知,您需要将文件/文件夹从FTP复制到azure blob存储

Step 1. Get list of SFTP locations
Step 2. Init Azure Blob Storage Connection
Step 3. Init SFTP
Step 4. Iterate Files in SFTP
Step 5. Store the file into Blob Storage
Step 6. Close SFTP connection
Step 7. Close Azure Blob Storage

谢谢你的回复。我已经更新了我的代码。我只是想知道我是否可以使用一些模式,比如迭代器模式来实现同样的效果。谢谢你的回复。我已经更新了我的代码。我只是想知道我是否可以使用一些模式,比如迭代器模式来实现同样的效果。