[英]Check If File Is In Use By Other Instances of Executable Run
在我太詳細之前,我的程序是使用C#.Net 4.0在Visual Studio 2010中編寫的。
我編寫了一個程序,該程序將為每次運行生成單獨的日志文件。 日志文件以時間命名,並且精確到毫秒(例如20130726103042375.log )。 如果該程序尚不存在,該程序還將為其生成當天的主日志文件(例如* 20130726_Master.log *)
在每次運行結束時,我想將日志文件追加到主日志文件中。 有沒有辦法檢查我是否可以成功追加? 並在“ Sleep
”后重試一秒鍾左右?
基本上,我有1個可執行文件,並且有多個用戶(假設有5個用戶)。
所有5個用戶將同時訪問和運行此可執行文件。 由於幾乎所有用戶都不可能在同一時間(最多毫秒)啟動,因此生成單個日志文件不會有問題。
但是,當我嘗試將那些日志文件合並到主日志文件時,就會出現問題。 雖然不太可能,但我認為如果有多個用戶附加到同一主日志文件,則該程序將崩潰。
我使用的方法是
File.AppendAllText(masterLogFile, File.ReadAllText(individualLogFile));
我已經檢查了lock
對象,但是我認為這種情況不起作用,因為有多個實例在運行,而不是在一個實例中運行多個線程。
我研究的另一種方式是try/catch
,像這樣
try
{
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch {}
但是我認為這不能解決問題,因為masterLogFile的狀態可以在短時間內改變。
因此,我的總體問題是:是否有一種方法可以在未使用masterLogFile的情況下追加它,並在短時超時后重試? 還是如果有其他方法可以創建masterLogFile?
在此先感謝您,很長的信息對不起。 我想確保我能傳達我的信息並解釋我嘗試過或研究過的內容,以免浪費任何人的時間。
如果有更多信息可以幫助您,請告訴我。
嘗試/捕獲是做事的方式。 如果對File.Open
的調用成功,則可以寫入文件。 想法是保持文件打開。 我建議類似的東西:
bool openSuccessful = false;
while (!openSuccessful)
{
try
{
using (var writer = new StreamWriter(masterlog, true)) // append
{
// successfully opened file
openSuccessful = true;
try
{
foreach (var line in File.ReadLines(individualLogFile))
{
writer.WriteLine(line);
}
}
catch (exceptions that occur while writing)
{
// something unexpected happened.
// handle the error and exit the loop.
break;
}
}
}
catch (exceptions that occur when trying to open the file)
{
// couldn't open the file.
// If the exception is because it's opened in another process,
// then delay and retry.
// Otherwise exit.
Sleep(1000);
}
}
if (!openSuccessful)
{
// notify of error
}
因此,如果無法打開文件,則請休眠並重試。
請參閱我的博客文章File.Exists僅是快照 ,以獲取更多詳細信息。
我會按照這種方式做一些事情,因為我認為這樣可以減少開銷。 如果拋出異常,try / catch將生成堆棧跟蹤(可能需要一整秒鍾)。 必須有一種更好的方法來自動執行此操作。 如果找到一個,我將其發布。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.