2016-03-28 7 views
0

Я хочу проверить, открыт ли 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 вместо функции.

С уважением.

+0

Почему вы предпочитаете Sub над функцией? Функция лучше, если вы хотите проверить, открыт ли файл или нет, поскольку вы можете заставить его возвращать True или False, поэтому вы можете проверить его в 'If'-statement. –

+0

Я бы предложил вам изменить тип возврата на 'Boolean' и вернуть' True' в последней строке вашей функции и вернуть 'False' в блок' Catch'. Я также думаю, что 'FileStream' будет лучше, чем' StreamWriter'. –

+0

@VisualVincent Не могли бы вы вывести код, который вы посоветовали? – Markowitz

ответ

0

Чтобы использовать этот код, можно использовать функцию, как в следующем примере:

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 

Функция, OpenUnlockedFile («C: \ Data.xlsb») запускается при нажатии Button1 (в этом пример). Если функция запущена и она ничего не возвращает, вы узнаете, что файл заблокирован.

Пожалуйста, обратите внимание, что вы также будете нуждаться в

Imports System.IO 

для этого примера, чтобы работать.

+0

Это не говорит ему, если он открыт или нет, практически ничего не делает, если вы не проверите его, как оператор 'If'. –

+0

Я видел это и сделал редактирование несколько минут назад! – Dustin

1

Вы должны изменить тип возврата на Boolean, чтобы он соответствовал вашим потребностям, а также переключился с StreamWriter на FileStream. Это связано с тем, что в сообщении, которое вы связали, 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 

Пожалуйста, обратите внимание, что либо функция будет только сказать вам, если файл доступен, то возможно, что процесс открыл его без блокировки его.

Смежные вопросы