栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

VB.NET检测文件是否已经打开或被其他进程占用

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

VB.NET检测文件是否已经打开或被其他进程占用

检测文件是否已经打开或被其他进程占用

在VB.NET保存文件时,不禁产生这样一个疑问,如果想保存的这个文件覆盖先前已经存在的文件,但这个文件已经被打开,程序运行会出错,如何检测保存的这个文件已经已经打开或者被其他进程占用并且提示这个错误?

一、本文主要解决问题

1、检测当前路径下保存的文件是否已经打开或被占用
2、不同文件下,文件名相同的两个文件出现误判的情况

二、解决方法

经过初步的学习,目前两个可以探索或者可以实现的方法

1、检测计算机进程中是否存在这个事件
2、以独占的方法打开文件

方法一

既然要检测已知文件是否已经打开,可以直接利用计算机进程来解答,检测当前任务管理器中是否存在该事件,如果存在,可以判定文件已经打开或者被占用。

部分代码:

SaveFileDialog1.Filter = "所有文件|*.text"
SaveFileDialog1.FilterIndex = 1
SaveFileDialog1.ShowDialog()
TextBox2.Text = SaveFileDialog1.FileName
Dim filename As String = TextBox3.Text
Dim pp() As Process = Process.GetProcesses '获取进程
Dim p As Process
For i = 0 To pp.Length - 1
       p = pp(i)
        If p.MainWindowTitle.Contains(filename) Then
        MsgBox("文件打开或被其他程序占用,请关闭后重试!")
            Exit Sub
            ElseIf p.MainWindowTitle.Contains(filenamee) Then
                MsgBox("该文件对应的误差补偿表文件打开或被其他程序占用,请关闭后重试!")
            Exit Sub
End If
Next

所用控件:SaveFileDialog、TextBox

存在问题:这个代码虽然能够直接检测文件是否已经打开或者被占用的情况,但出现了一个明显的问题,它只能检测这个文件名是否出现被打开或被占用的问题,因此,在其他文件路径下打开这个文件时,想在这个文件夹下以相同文件名保存文件时,会出现误判的情况。

解决思路:找到这个运行进程对应的文件名所在的路径是否是当前的路径,如果是,说明文件已经打开或被占用,如果不是可以正常保存。

方法二

某些文件类型如果打开,对这个文件进行删除复制粘贴或者独占方式打开时,会出现问题。因此,可以利用这个检测问题是否存在来判断。

部分代码:

        SaveFileDialog1.Filter = "所有文件|*.xps"
        SaveFileDialog1.FilterIndex = 1
        SaveFileDialog1.ShowDialog()
        TextBox2.Text = SaveFileDialog1.FileName

        '如果当前保存的文件已经打开或被其他程序占用时, 显示错误
        If Dir(TextBox2.Text) <> "" Then '判断当前文件夹下该文件存不存在,如果存在,执行里面内容
            If Fileisopen(TextBox2.Text) = True Then
                MsgBox("该文件已经打开或被其他程序占用,请关闭后重试!")
                Exit Sub
            End If
        End If
        
        ’以独占的方式打开文件,来检测问题
        Private Function Fileisopen(ByVal Filepath As String) As Boolean
        On Error GoTo erropen
        Dim Ffile As New FileStream(Filepath, FileMode.Open, FileAccess.Read, FileShare.None)
        Ffile.Close()
         Ffile.Dispose()     '释放相关资源,此语句为必要语句,不然在某种特殊情况下出现误判
        Exit Function
erropen:
        Fileisopen = True
    End Function

所用控件:SaveFileDialog、TextBox

注释说明:判断当前文件路径下是否存在这个文件,如果不存在,则直接跳过,如果存在,再进行判断。否则自定义函数会出现,当文件夹下不存在这个文件时,以独占方式打开这个不存在的文件会出现误判的情况,会出现提示框。

找到另外一个解决的办法,不过有一定的局限性。参见以下文档:

.net解决保存文件名冲突的巧妙方法

由于楼主尚在学习当中,因此代码如果有改进之处,请不吝赐教,谢谢!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/906960.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号