使用PowerShell上传文件至Data Lake Gen2时遇409状态码错误
解决ADLS Gen2上传文件时的409 OperationNotAllowedInCurrentState错误
错误原因
你遇到的409错误是因为上传文件时指定的-Path参数是已存在的目录路径,而非目标文件的完整路径。当尝试将文件上传到一个已存在的目录名位置时,系统会试图创建一个与目录同名的文件,这会引发实体冲突(目录和文件不能同名),从而触发OperationNotAllowedInCurrentState错误。
解决方案
上传文件时,必须将-Path参数设置为完整的目标文件路径(目录路径+文件名),而非仅目录路径。同时可添加逻辑确保目标目录存在,避免因目录缺失导致的其他问题。
修正后的代码
1. 调整调用逻辑,传入正确的文件路径
$DataLakeDetails = @{ Context = New-AzStorageContext ` -UseConnectedAccount ` -StorageAccountName $(Get-AzName @NameDetails -ResourceType 'dls' -Separator '') FileSystem = 'dls' } # 源文件路径 $sourceFile = "path/to/your-file.json" # 提取源文件名 $fileName = [System.IO.Path]::GetFileName($sourceFile) # 目标文件完整路径(目录+文件名) $targetFilePath = "some/dir/dir/_delta_log/$fileName" # 调用上传函数 Add-NewFileAzDataLakeGen2Item @DataLakeDetails -Source $sourceFile -Path $targetFilePath
2. 优化上传函数,自动创建目标目录
function Add-NewFileAzDataLakeGen2Item { param ( $Context, $FileSystem, $Source, $Path ) Try{ # 提取目标父目录路径 $targetParentDir = Split-Path $Path -Parent # 若父目录不存在,自动创建 if (-not [string]::IsNullOrEmpty($targetParentDir)) { $null = New-AzDataLakeGen2Item -Context $Context -FileSystem $FileSystem -Path $targetParentDir -Directory -Force } # 执行文件上传 New-AzDataLakeGen2Item -Context $Context -FileSystem $FileSystem -Path $Path -Source $Source -Force return $true } catch{ Write-Error $_.Exception.Message return $false } }
验证逻辑
- 确保
$targetFilePath包含具体的文件名,而非仅目录名 - 函数会先检查并创建目标文件的父目录,再执行上传操作
- 这样就不会出现目录与文件同名的冲突,可正常完成上传
内容的提问来源于stack exchange,提问作者justsander
相关产品推荐
相关产品推荐

