Одновременная загрузка файла в общий файловый ресурс Azure с помощью портала и его загрузка с помощью библиотек ShareClient в качестве веб-задания.

У меня есть запланированное веб-задание, которое запускается каждые 5 минут.

  1. Он проверяет наличие файлов в общей папке Azure с помощью библиотек ShareClient.
  2. Если файлы доступны, веб-задание загружает файл и удаляет исходный файл.
  3. Поэтому, когда большой файл загружается с портала в общий файловый ресурс (> 2 ГБ для загрузки требуется ~ 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();
                }

person baalu    schedule 30.10.2020    source источник
comment
Как дела? Полезен ли мой пост для вашего сценария?   -  person Stanley Gong    schedule 03.11.2020


Ответы (1)


Насколько я понимаю, вы хотите убедиться, что полностью загружен только большой файл, который вы загрузите. Если это так, возможно, вы можете просто проверить временной разрыв между отметкой времени последнего изменения файла и текущей отметкой времени 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();
                        }
                    } 
person Stanley Gong    schedule 02.11.2020
comment
Работал для моего сценария. Спасибо - person baalu; 04.11.2020
comment
@baalu, рад узнать, что это полезно, удачного кодирования! - person Stanley Gong; 04.11.2020