2013-05-27 79 views
2

我有一個文本文件,我想檢查它是否已經打開。 問題是可以多次打開文件,並且沒有例外。如何檢查文本文件是否正在使用?

我想:

stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 

也不例外。

我也試過

using (Stream stream = new FileStream("MyFilename.txt", FileMode.Open)) 

也不例外。

即使

System.Diagnostics.Process.GetProcessesByName("MyFilename.txt").Length < 1 

,但即使該文件是打開它returns 0

MyFilename.txt只是一個名字,在真正的代碼中它是真正的文件路徑。

我可以寫什麼insted?

謝謝! 格雷斯

回答

2

如果記事本不完全鎖定的文本文件,那麼你需要使用不同的方法

Process[] pList = Process.GetProcessesByName("notepad"); 
foreach(Process p in pList) 
{ 
    if(p.MainWindowTitle.Contains("MyFilename.txt") 
     ...... 
} 

當然這個的一種方式不是一個傻瓜解決方案。我可以用寫字板或其他文本編輯器打開文件,如果它沒有鎖定,我們再次出現同樣的問題

但是,如果您成功完全打開文件,那麼記事本問題就是保存其更改

+0

這就是我需要的!謝謝!!你解決了我的問題。 – user2348001

+0

你知道另一種不會鎖定的類型,比如記事本嗎? – user2348001

+0

對不起,不,這是一個試驗和看到的方法在這裏 – Steve

1

是有使用FileStream

protected virtual bool IsFileUsed(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
      stream.Close(); 
    } 

    //file is not in use 
    return false; 
} 
+0

正如我所說,我嘗試過。沒有例外。 – user2348001

+0

檢查此鏈接http://www.pinvoke.net/default.aspx/kernel32.OpenFile – Rahul

+0

@Rahul:當您複製粘貼代碼時,請務必鏈接到原始帖子。那裏有很多有用的信息 - http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use –