2016-03-28 23 views
0

Ich möchte überprüfen, ob C: \ Data.xlsb bereits geöffnet ist oder nicht.Kann ich überprüfen, ob die Datei bereits geöffnet ist?

Ich habe hier folgenden Code bekam von 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 

Aber ich weiß nicht, wie Sie den Code oben zu verwenden.

Ich ziehe es sub statt Funktion.

Mit freundlichen Grüßen.

+0

Warum bevorzugen Sie einen Sub über eine Funktion? Eine Funktion ist viel besser, wenn Sie überprüfen möchten, ob die Datei geöffnet ist oder nicht, da Sie True oder False zurückgeben können, also können Sie es in einer 'If'-Anweisung überprüfen. –

+0

Ich würde vorschlagen, dass Sie den Rückgabetyp zu einem 'Boolean' modifiziert haben und in der letzten Zeile Ihrer Funktion' True' zurückgeben und '' '' 'Catch''-Block zurückgeben. Ich denke auch, dass ein 'FileStream' besser wäre als ein' StreamWriter'. –

+0

@VisualVincent Könnten Sie bitte den von Ihnen empfohlenen Code posten? – Markowitz

Antwort

0

diesen Code zu verwenden, würden Sie die Funktion wie im folgenden Beispiel verwenden:

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 

Die Funktion, OpenUnlockedFile ("C: \ Data.xlsb") ausgeführt wird, wenn Sie Button1 drücken (in diesem Beispiel). Wenn die Funktion ausgeführt wird und Nothing zurückgibt, wissen Sie, dass die Datei gesperrt ist.

Bitte beachten Sie, dass Sie auch

Imports System.IO 

für dieses Beispiel zu arbeiten brauchen.

+0

Das ihm nicht sagen, ob es geöffnet ist oder nicht, praktisch es tut nichts, wenn Sie es überprüfen in wie eine 'If'-Anweisung. –

+0

Das habe ich auch gesehen und vor ein paar Minuten den Schnitt gemacht! – Dustin

1

Sie sollten den Rückgabetyp auf ändern, um Ihre Anforderungen besser zu erfüllen, und auch von einem StreamWriter zu einem FileStream wechseln. Das liegt daran, dass Sie in der Post, die Sie verlinkt haben, das OP wollte, um in die Datei zu schreiben, was ich glaube nicht, dass Sie wollen (oder zumindest keinen Klartext verwenden 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 

Dann würden Sie es wie folgt verwenden:

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 

Bitte beachten Sie, dass entweder Funktion Ihnen nur sagen, wenn die Datei zugegriffen werden kann, ist es möglich, dass ein Prozess ohne Verriegelung es geöffnet hat.

Verwandte Themen