有什么方法可以检查文件是否已经打开?

Is there a way I can check to see if the file is already open?

我想检查 C:\Data.xlsb 是否已经打开。

我从这里得到了以下代码 How to tell if a certain Excel file is open using VB.NET?

Public Shared Function OpenUnlockedFile(ByVal path As String) As StreamWriter
Dim sw As StreamWriter = nothing
Try
    sw = New StreamWriter(path)
Catch ex As IOException When System.Runtime.InteropServices.Marshal.GetLastWin32Error() = 32
    REM locked, return nothing
End Try
Return sw
End Function

但是我不知道如何使用上面的代码

我更喜欢 sub 而不是 function。

此致。

要使用此代码,您将使用以下示例中的函数:

Imports System.IO

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If OpenUnlockedFile("C:\Data.xlsb") Is Nothing Then
            MessageBox.Show("File is locked")
        End If
    End Sub

    Public Shared Function OpenUnlockedFile(ByVal path As String) As StreamWriter
        Dim sw As StreamWriter = Nothing
        Try
            sw = New StreamWriter(path)
        Catch ex As IOException When System.Runtime.InteropServices.Marshal.GetLastWin32Error() = 32
        REM locked, return nothing
        End Try
        Return sw
    End Function

End Class

每当您按下 Button1(在本例中)时,函数 OpenUnlockedFile("C:\Data.xlsb") 就是 运行。如果函数是 运行 而它 returns 什么都没有,那么你就会知道文件被锁定了。

请注意,您还需要

Imports System.IO

为了让这个例子起作用。

您应该将 return 类型更改为 Boolean 以更好地满足您的需求,并将 StreamWriter 切换为 FileStream。这是因为在 post 中你链接了 OP 想要写入的文件,我认为你不需要(或者至少不使用纯文本 StreamWriter)。

Public Shared Function IsFileAvailable(ByVal path As String) As Boolean
    Try
        Dim fs As New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None)
        fs.Close()
    Catch ex As IOException When System.Runtime.InteropServices.Marshal.GetLastWin32Error() = 32
        Return False
    End Try
    Return True
End Function

那么你就可以像这样使用它:

If IsFileAvailable("C:\Data.xlsb") = True Then
    'File is not locked, do what you like here.
Else
    MessageBox.Show("The file is locked!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If

请注意,这两个函数只会告诉您文件是否可访问,有可能某个进程在没有锁定的情况下打开了它。