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

Simultaneous uploading of a file to Azure File share using portal and downloading it using ShareClient libraries as WebJob

我有一个每 5 分钟触发一次的预定 WebJob。

  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();
                        }
                    }