2012-06-15 84 views
1

我想知道是否可以檢查文件「test.txt」是否打開?如果是的話顯示一條消息,說明該文件正在使用中?我最大的問題是該文件可以在記事本,單詞,Excel等打開。我有一些基本的編碼,它檢查文件是否打開 - 我試圖做的是檢查文件當前是否打開,如果它不是在使用中,然後繼續編碼,到目前爲止我有以下編碼。檢查特定文件當前是否打開

Dim Process() As Process = System.Diagnostics.Process.GetProcessesByName("notepad") 
Dim Process2() As Process = System.Diagnostics.Process.GetProcessesByName("word") 

For Each p As Process In Process 
    If p.MainWindowTitle.Contains("test") Then 
     MessageBox.Show("file open") 
    Else 
     'Run my code 
    End If 
Next 

For Each p2 As Process In Process2 
    If p2.MainWindowTitle.Contains("test") Then 
     MessageBox.Show("file open") 
    Else 
     'Run my code 
    End If 
Next 
+0

http://stackoverflow.com/questions/860656/how-does-one-figure-out-what-process-locked-a-file-using-c – JamieSee

+3

或http:// STAC koverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use/937558#937558 – ChrisW

+0

感謝球員,但這兩個主題似乎包含大量的編碼時,編碼我已經發布了幾行或多行這個工作? – JackSparrow

回答

1

你爲什麼不嘗試對文件進行操作(例如,由@ChrisW建議開放),並檢查其鎖定,而不是:

Catch ex As Exception 
If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then 
' do something? 
End If 
End Try 

Private Shared Function IsFileLocked(exception As Exception) As Boolean 
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1) 
    Return errorCode = 32 OrElse errorCode = 33 
End Function 
0

許多應用程序在加載文件時創建臨時副本。所以很難檢查這一點。你可以創建一個調試器來查看哪個文件被一個二進制文件加載,這可能是過度殺傷性的。

還是用這樣的:

try 
{ 
    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
} 
catch (IOException) 
{ 
    // the file is locked and not available to read or write. 
    return true 
} 
finally 
{ 
// close the stream 
} 
+0

謝謝邁克,說實話我在第一篇文章中的代碼正在工作,但我可以就如何將它加入到一起做一點幫助,如果文件沒有運行,那麼運行我的程序。 – JackSparrow

+0

這和我上面評論中的鏈接是一樣的。 http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use/937558#937558 – ChrisW

+0

+1 @ChrisW我已經發生過這種情況現在給我幾次。 –