问题描述
- 它使用ShareClient库检查Azure File Share中是否有文件。
- 如果文件可用,则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();
}
}