簡體   English   中英

檢查文件是否被可執行運行的其他實例使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM