使用门户同时将文件上传到Azure文件共享,并使用ShareClient库作为WebJob下载文件

问题描述

我有一个计划的WebJob,每5分钟触发一次。

  1. 它使用ShareClient库检查Azure File Share中是否有文件
  2. 如果文件可用,则WebJob将下载文件删除原始文件
  3. 因此,当有较大的文件从门户网站上传文件共享时(> 2GB会花费大约1分钟的时间上传并且未安装文件共享)
  4. 同时触发WebJob并开始运行,WebJob找到正在上传文件,并且正在下载文件内容的一部分,直到那时为止。
  5. 其余内容未下载。

在这种情况下如何下载整个文件?完全上传后,是否可以下载文件

示例代码

var shareItems = shareDirectory.GetFilesAndDirectories().Where(item => item.IsDirectory == false).ToList();
                foreach (var item in shareItems)
                {
                    ShareFileClient file = shareDirectory.GetFileClient(item.Name);
                    if (await file.ExistsAsync())
                    {
                        string filePath = Path.Combine(destPath,item.Name);
                        using (FileStream stream = File.OpenWrite(filePath))
                        {
                            try
                            {
                                ShareFileDownloadInfo download = await file.DownloadAsync();
                                download.Content.copyTo(stream);
                            }
                            catch (Exception ex)
                            {
                                throw;
                            }
                            stream.Flush();
                            stream.Close();
                        }
                    }
                    //Delete the original file from file share 
                    file.Delete();
                }

解决方法

根据我的理解,您要确保仅完整上传了一个大文件,然后才能下载该文件。 如果是这样,也许您只需检查文件上次修改的时间戳与当前UTC时间戳之间的时间间隔即可。

如果要上传文件,则其LastModified属性将一直更改,根据我的测试,当前UTC时间戳之间的时间间隔约为1-3秒。

因此您可以尝试以下操作:

var shareItems = shareDirectory.GetFilesAndDirectories().Where(item => item.IsDirectory == false).ToList();
            foreach (var item in shareItems)
            {
                ShareFileClient file = shareDirectory.GetFileClient(item.Name);
                if (file.ExistsAsync().GetAwaiter().GetResult())
                {

                    var fileLastModifiedTime = file.GetProperties().Value.LastModified;
                    var currentTime = DateTime.UtcNow;
                    
                    //Only download files that have finished uploading 5 minutes ago
                    if (fileLastModifiedTime.AddMinutes(5).CompareTo(currentTime) < 0) {

                        string filePath = Path.Combine(destPath,item.Name);
                        using (FileStream stream = File.OpenWrite(filePath))
                        {
                            try
                            {
                                ShareFileDownloadInfo download = file.DownloadAsync().GetAwaiter().GetResult();
                                download.Content.CopyTo(stream);
                            }
                            catch (Exception ex)
                            {
                                throw;
                            }
                            stream.Flush();
                            stream.Close();
                        }
                    } 

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...