You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:28:13