PowerShell调用GetRequestStream上传FTP文件时遇文件被占用错误的问题求助
PowerShell调用GetRequestStream上传FTP文件时遇文件被占用错误的问题求助
各位好,我最近尝试用PowerShell把本地电脑的文件上传到FTP服务器时遇到了一个错误,具体报错信息如下:
Exception calling "GetRequestStream" with "0" argument(s): "The process cannot access the file 'Path_to_File' because it is being used by another process."
At line:1 char:1
- $ftpRequestStream = $ftpRequest.GetRequestStream()
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : WebException
这是我目前的代码(函数部分未完成):
$usr = "admin" $pass = "admin" $ftp="ftp://$RouterIP" $subfolder='/' $FileName = "def.backup" $DirTarget = "C:\MyOwn\Scritps" $ftpuri = $ftp + $subfolder + $FileName $SourceFile = "$DirTarget\$FileName" $AuthRequest = "ftp://"+$usr + ":" + $pass + "@$RouterIP" + "/$FileName" function UploadFile ($SourceUri,$UserName,$Password){ $fileToUpload = $SourceUri # 未完成的上传逻辑 }
我现在搞不清楚到底是哪个进程在占用这个文件,也不确定是不是代码里的流处理有问题,有没有大佬能帮忙分析下怎么排查和解决这个问题?
可能的排查方向和解决方案:
- 检查外部程序占用:先确认
def.backup文件有没有被其他程序打开,比如记事本、代码编辑器、甚至杀毒软件后台扫描。关掉所有可能关联这个文件的程序后,重新运行脚本试试。 - 用资源监视器定位占用进程:打开Windows「资源监视器」(可通过任务管理器「性能」标签进入),切换到「关联的句柄」标签,搜索文件名
def.backup,就能看到具体是哪个进程在占用它,结束对应进程后再测试。 - 修正代码中的流处理逻辑:如果是脚本自身进程占用了文件,大概率是之前打开文件的流没有正确关闭。可以用
try/finally块手动关闭流,或者在PowerShell 5.1及以上版本用using语句自动管理流生命周期,这里给你一个改进后的上传函数示例:function UploadFile ($SourceUri, $UserName, $Password) { $ftpUri = "ftp://$UserName`:$Password@$RouterIP/$FileName" $ftpRequest = [System.Net.FtpWebRequest]::Create($ftpUri) $ftpRequest.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile $ftpRequest.UseBinary = $true try { # 用using语句自动释放流资源 using ($fileStream = [System.IO.File]::OpenRead($SourceUri)) { using ($ftpStream = $ftpRequest.GetRequestStream()) { $fileStream.CopyTo($ftpStream) } } $response = $ftpRequest.GetResponse() Write-Host "文件上传成功: $($response.StatusDescription)" $response.Close() } catch { Write-Error "上传失败: $_" } } - 临时替换文件测试:复制一份
def.backup文件并改名,用新文件测试上传,如果能成功,就说明原文件确实被其他进程占用了。
备注:内容来源于stack exchange,提问作者Catcher Rem
相关产品推荐
相关产品推荐

