.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
相关产品推荐
相关产品推荐

