VB.NET应用中CSV文件因被其他进程占用无法访问的问题
解决共享文件夹中CSV文件被进程锁定的问题
核心修复:使用Using语句确保资源正确释放
手动调用Close()在共享文件夹环境下(尤其是存在网络延迟时)可能因异常、缓冲区未完全刷新等原因导致文件句柄未释放,改用Using语句能自动管理StreamWriter的生命周期,确保无论是否发生异常,文件资源都会被及时释放。
修改后的代码:
Try Dim nowPathString As String = Now().ToString("yyyyMMdd-hhmmss") Dim nowString As String = Now().ToString() ' 修正字符串插值语法,确保路径格式正确 Dim csvFilePath As String = $"\\webserver\ExcelTest\Test-{nowPathString}.csv" ' Using块自动调用Close()和Dispose(),彻底释放文件句柄 Using outFile As IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(csvFilePath, False) outFile.WriteLine("Warehouse, StockItemCode, AllocationQuantity, Reference, SecondReference, ActivityDate") outFile.WriteLine($"Main, SHE060, 1, 123456, 123456-1, {nowString}") ' 显式刷新缓冲区,确保所有数据写入磁盘后再释放资源 outFile.Flush() End Using Catch ex As Exception MsgBox(ex.Message) End Try
额外排查与优化建议
- 修正路径语法:原代码中
csvFilePath的字符串插值写法存在语法错误,需确保用$"路径内容"的格式正确解析共享路径。 - 显式指定文件共享模式:如果默认的共享模式仍导致锁定冲突,可改用
File.Open方法明确设置访问权限:
Using fs As IO.FileStream = IO.File.Open(csvFilePath, IO.FileMode.Create, IO.FileAccess.Write, IO.FileShare.Read) Using outFile As New IO.StreamWriter(fs) outFile.WriteLine("Warehouse, StockItemCode, AllocationQuantity, Reference, SecondReference, ActivityDate") outFile.WriteLine($"Main, SHE060, 1, 123456, 123456-1, {nowString}") outFile.Flush() End Using End Using
- 排查外部锁定进程:
- 检查防病毒软件是否实时扫描共享文件夹,临时关闭扫描测试,若问题解决则将共享文件夹添加到扫描排除列表。
- 禁用Windows搜索服务对共享文件夹的索引功能:打开「索引选项」,移除共享文件夹的索引项,避免索引进程长时间占用文件句柄。
- 确认是否有其他应用(如Excel、文件管理器预览窗格)在访问生成的CSV文件,这类程序可能会保持文件句柄打开。
- 检查共享权限:确保共享文件夹权限允许应用程序执行创建、写入、删除等完整操作,同时通过「计算机管理」→「共享文件夹」查看是否有异常会话占用文件句柄。
内容的提问来源于stack exchange,提问作者JordanGaw12
相关产品推荐
相关产品推荐

