微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用门户同时将文件上传到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();
                        }
                    } 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?