使用门户将文件同时上传到 Azure 文件共享并使用 ShareClient 库将其下载为 WebJob
Simultaneous uploading of a file to Azure File share using portal and downloading it using ShareClient libraries as WebJob
我有一个每 5 分钟触发一次的预定 WebJob。
- 它使用 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();
}
}
我有一个每 5 分钟触发一次的预定 WebJob。
- 它使用 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();
}
}