我有一个计划的 WebJob,每 5 分钟触发一次。
- 它使用 ShareClient 库检查 Azure 文件共享中是否有任何文件。
- 如果文件可用,则 WebJob 会下载该文件并删除原始文件。
- 因此,当有一个大文件从门户上传到文件共享时(>2GB,上传需要约 1 分钟且未挂载文件共享)
- 同时WebJob被触发并开始运行,WebJob发现正在上传的文件,并且正在下载此时已上传的部分文件内容。
- 其余内容未下载。
在这种情况下如何下载整个文件?是否可以在文件完全上传后才下载?
示例代码:
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/