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

无法移动文件:VB.NET程序遇文件被其他进程占用异常

问题分析与修复方案

原代码的明显语法问题

  • VB.NET语法错误:函数体需用End Function收尾,不能用大括号{}
  • 字符串常量用了中文引号“”,必须换成英文引号""
  • Process数组的长度属性是Length,不是集合用的Count
  • 判断条件processList.Length < 0逻辑错误,数组长度不可能为负,应该判断processList.Length = 0

客户端偶发异常的核心原因及解决办法

  1. 进程提前退出:获取进程列表后,遍历前可能已有进程终止,调用CloseMainWindow()会触发InvalidOperationException

    • 修复:遍历前用HasExited属性检查进程是否还在运行,避免操作已终止的进程
  2. 固定等待时间不适用:客户端机器性能通常比测试环境差,7000毫秒可能不足以让PDF完全加载或进程完全退出,导致后续移动文件时提示被占用

    • 修复:替换固定等待为等待进程进入空闲状态+关闭后等待进程退出,用WaitForInputIdle()和WaitForExit()(可设置超时)
  3. 进程名匹配不全:不同版本Adobe Reader的进程名可能是AcroRd32(32位)或AcroRd64(64位),原代码只处理了前者,可能匹配不到64位进程

    • 修复:同时检查两种进程名

修复后的完整VB.NET代码

Function CloseProcess(processName As String) As Boolean
    Dim processList As Process() = Process.GetProcessesByName(processName)
    
    ' 传入进程名未找到时,同时查找32位和64位Adobe Reader进程
    If processList.Length = 0 Then
        processList = Process.GetProcessesByName("AcroRd32").Concat(Process.GetProcessesByName("AcroRd64")).ToArray()
    End If
    
    Dim allClosedSuccessfully As Boolean = True
    For Each proc As Process In processList
        Try
            ' 跳过已退出的进程
            If proc.HasExited Then Continue For
            
            ' 尝试优雅关闭主窗口
            If proc.CloseMainWindow() Then
                ' 等待进程退出,超时10秒
                If Not proc.WaitForExit(10000) Then
                    proc.Kill()
                    proc.WaitForExit()
                End If
            Else
                ' 优雅关闭失败,强制终止
                proc.Kill()
                proc.WaitForExit()
            End If
        Catch ex As InvalidOperationException
            ' 进程已在操作前退出,标记为未成功但继续处理其他进程
            allClosedSuccessfully = False
        Catch ex As Exception
            ' 处理权限等其他异常,可添加日志记录
            allClosedSuccessfully = False
        Finally
            ' 释放进程资源,避免内存泄漏
            proc.Dispose()
        End Try
    Next
    
    Return allClosedSuccessfully
End Function

额外优化建议

  • 启动批处理后,不要直接等待固定时长,而是监控目标Adobe进程的启动状态,确保进程就绪后再执行后续操作
  • 移动文件前,再次检查是否还有关联的Adobe进程在运行,确认文件未被占用再执行移动
  • 在客户端环境添加异常日志,记录异常类型、消息和发生场景,方便排查偶发问题

内容的提问来源于stack exchange,提问作者Marduk HS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:25:21