Azure Files:如何识别正在上传的文件?仅列出已完成上传文件方案
解决Azure Files仅列出已完成上传文件的问题
方法1:通过租约(Lease)检测文件状态
由于无法控制上传端,可通过尝试获取文件的排他租约来判断是否完成上传:
- 文件上传过程中,上传进程会持有写入锁,此时获取租约会失败;
- 若租约获取成功,说明文件已无写入操作,上传完成。
示例PowerShell代码:
$storageAccountName = "你的存储账户名" $storageAccountKey = "你的存储账户密钥" $shareName = "你的文件共享名" $context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey $files = Get-AzStorageFile -ShareName $shareName -Context $context | Where-Object { !$_.IsDirectory } foreach ($file in $files) { try { # 尝试获取15秒排他租约,成功则文件已上传完成 $lease = $file.CloudFile.AcquireLease(15, $null) Write-Host "已完成上传: $($file.Name)" # 释放租约,不影响后续操作 $file.CloudFile.ReleaseLease($lease) } catch { # 获取租约失败,说明文件正在上传中 Write-Host "上传中: $($file.Name)" } }
方法2:检查文件的ContentMD5属性
如果上传工具(如AzCopy、Azure Storage Explorer)默认生成文件MD5哈希,可通过ContentMD5属性判断:
- 上传过程中该属性为空;
- 上传完成后,Azure会自动计算并填充该属性(需上传端支持)。
示例PowerShell代码:
$storageAccountName = "你的存储账户名" $storageAccountKey = "你的存储账户密钥" $shareName = "你的文件共享名" $context = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey $completedFiles = Get-AzStorageFile -ShareName $shareName -Context $context | Where-Object { !$_.IsDirectory -and $_.CloudFile.Properties.ContentMD5 -ne $null } Write-Host "已完成上传的文件列表:" $completedFiles | Select-Object Name, Length
方法3:利用存储日志筛选完成事件
启用存储账户的存储分析日志,通过记录的操作事件筛选已完成上传的文件:
- 进入Azure门户,找到目标存储账户,在「监控」>「日志」中启用文件服务日志记录;
- 日志会记录文件上传完成的
PutFile或AppendFile完成事件; - 通过Azure Monitor Logs或存储容器中的日志文件,筛选出已完成上传的文件路径。
内容的提问来源于stack exchange,提问作者arao6
相关产品推荐
相关产品推荐

