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

.NET File.Copy/File.Delete网络共享文件锁定问题求助

网络共享文件锁定问题:.NET File类异常排查与修复

问题概述

一段运行25年未修改的VB.NET代码,近2-3周出现.NET原生File.Copy()和File.Delete()函数在网络共享路径下的文件锁定问题,锁定永不释放导致程序崩溃,需手动在文件共享端释放锁定。改用Robocopy替代File.Copy()可正常运行,排除权限问题;本地磁盘路径运行无异常,仅网络共享路径出现该问题。

核心问题分析

示例代码中手动管理StreamWriter资源时,StrWriter.Close()可能未彻底释放网络共享文件的句柄——网络环境下资源释放的延迟远大于本地磁盘,导致下一次循环执行File.Delete()时,文件仍被系统锁定。此外,近期.NET Framework或Windows系统更新可能改变了File类在网络共享场景下的资源回收逻辑,引发句柄泄漏。

解决方案

1. 使用Using语句自动管理资源

Using块会自动调用对象的Dispose()方法,确保非托管资源(如网络文件句柄)被及时释放,避免手动Close()可能导致的资源泄漏。修改后的代码:

Imports System.IO
Try
    Dim x As Integer
    For x = 1 To 5
        Dim filePath = "\\fs1\public1\LogFile.txt"
        If File.Exists(filePath) Then
            File.Delete(filePath)
        End If
        ' Using块自动释放StreamWriter资源
        Using strWriter As StreamWriter = File.CreateText(filePath)
            strWriter.WriteLine("Hello")
        End Using
    Next
Catch ex As Exception
    MsgBox(ex.Message)
End Try

2. 用File.WriteAllText简化文件写入操作

File.WriteAllText方法封装了文件打开、写入、关闭的全流程,内部会自动处理资源释放,无需手动管理流对象,能有效避免句柄泄漏问题:

Imports System.IO
Try
    Dim x As Integer
    For x = 1 To 5
        Dim filePath = "\\fs1\public1\LogFile.txt"
        If File.Exists(filePath) Then
            File.Delete(filePath)
        End If
        File.WriteAllText(filePath, "Hello" & Environment.NewLine)
    Next
Catch ex As Exception
    MsgBox(ex.Message)
End Try

3. 指定FileOptions.WriteThrough绕过缓存

网络共享场景下,文件系统缓存可能导致句柄释放延迟,创建文件时指定FileOptions.WriteThrough可强制直接写入磁盘,避免缓存引发的锁定问题:

Imports System.IO
Try
    Dim x As Integer
    For x = 1 To 5
        Dim filePath = "\\fs1\public1\LogFile.txt"
        If File.Exists(filePath) Then
            File.Delete(filePath)
        End If
        ' 绕过缓存,直接写入磁盘
        Using fs As FileStream = New FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, FileOptions.WriteThrough)
            Using strWriter As StreamWriter = New StreamWriter(fs)
                strWriter.WriteLine("Hello")
            End Using
        End Using
    Next
Catch ex As Exception
    MsgBox(ex.Message)
End Try

4. 排查系统与.NET更新

由于代码长期稳定运行,近期出现问题可能与.NET Framework或Windows系统更新有关:

  • 检查客户端和文件服务器近期安装的更新,尝试回滚可疑的.NET Framework或Windows更新,验证问题是否消失。
  • 确认.NET Framework版本是否与之前一致,避免自动更新导致的版本变更。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:56:52