有什么方法可以检查文件是否已经打开?
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
请注意,这两个函数只会告诉您文件是否可访问,有可能某个进程在没有锁定的情况下打开了它。
我想检查 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
请注意,这两个函数只会告诉您文件是否可访问,有可能某个进程在没有锁定的情况下打开了它。