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

标签 azure fileshare webjob

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

  1. 它使用 ShareClient 库检查 Azure 文件共享中是否有任何文件。
  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();
                        }
                    } 

关于azure - 使用门户同时将文件上传到 Azure 文件共享,并使用 ShareClient 库作为 WebJob 下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64608872/

相关文章:

mongodb - 可以在不启用分片/分区的情况下使用cosmos DB吗?

Azure Data Lake Gen2 存储帐户 blob 与 adf 选择

powershell - Azure Powershell 网站 cmdlet 在服务器上无法正常工作

c# - 无法在 Windows 10 中使用 DataTransferManager 共享图像

Azure 计划程序无法触发使用 WebApp 发布的 OnDemand WebJob

c# - 在 Windows 服务和 Azure WebJob 之间利用单一代码库的方法

linux - 通过 Azure 自动化在 Azure Linux VM 上运行 SSH 命令

windows - 使用 Share-Delete 打开文件是否允许其他人写入?

c# - Azure 文件共享 ListFilesAndDirectoriesSegmentedAsync() 身份验证失败

python - Azure Web作业导入错误: No module named email_validator