2012-09-03 34 views
2

我想使用C#/ .NET在Windows 7主機上打開附加文件。我想爲此使用通常的文件輸出操作。我發現這樣的解決方案:如何設置文件權限以防止其他人對我的文件進行獨佔鎖定?

FileStream trace_fd = new FileStream(r"c:\temp\testlog.txt", 
            FileMode.Append, 
            FileAccess.Write, 
            FileShare.ReadWrite) 

即使我的程序與上面的行啓動並運行,我的跟蹤文件是可讀的。我沒有例外,該文件是由另一個進程使用了​​從正確的代碼是這樣的:

FileStream good_logreader_fd = new FileStream("c:\temp\testlog.txt", 
               FileMode.Read, 
               FileAccess.Read, 
               FileShare.ReadWrite) 

然後,我有這樣的行另一程序(越野車的日誌掃描器):

FileStream bad_logreader_fd = new FileStream("c:\temp\testlog.txt", 
              FileMode.Read, 
              FileAccess.Read, 
              FileShare.None) 

這樣的行顯然是日誌掃描程序的一個缺陷。如果我的程序沒有運行,那麼buggy logcaner將獲得獨佔鎖定,並且隨後運行我的程序將無法獲取跟蹤文件的fd。

我的問題是我能做些什麼來防止這種可怕的情況發生。 例如我可以爲跟蹤文件設置文件權限以防止任何人進行獨佔鎖定嗎?如果是,那麼如何?還有什麼可以保護我的程序免受buggy日誌掃描程序問題的影響?請注意,我必須在我的程序運行之間保留相同的跟蹤文件名。

回答

2

您無法設置權限以允許對文件進行任何訪問,但以某種方式限制FileShare.None,因爲文件共享模式與訪問權限無關。

權限給一個進程(基於它運行的帳戶)訪問文件/資源​​。如果訪問授權進程可以打開它想要的任何共享模式的文件。如果此共享模式與文件請求上的現有共享模式不衝突,則現在文件將具有此共享模式(與前一個共享模式結合)。詳情請參閱CreateFile- dwShareMode section

在您的情況下,日誌閱讀器需要具有打開文件的權限,因此如果它是第一個打開文件的進程,它將能夠設置ShareMode.None。正如devshorts所說的那樣,你沒有太多的工具可以改變侵入過程或者破解文件訪問方法(搜索「hook CreateFile」)。

備註:如果您的日誌閱讀器在與其他進程相同的帳戶下運行,則權限無法提供另一個原因 - 因爲Windows中沒有「每進程」權限,所有進程都將共享相同的用戶權限。

2

據我所知,你不能阻止其他人試圖以另一種文件訪問模式打開文件而不修改他們的代碼。

相關問題