Прежде чем вдаваться в подробности, скажу, что моя программа написана в Visual Studio 2010 с использованием C# .Net 4.0.
Я написал программу, которая будет генерировать отдельные файлы журнала для каждого запуска. Файл журнала называется по времени и имеет точность до миллисекунды (например, 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?
Заранее спасибо и извините за длинное сообщение. Я хочу убедиться, что я донес свое сообщение и объяснить, что я пытался или исследовал, чтобы мы не тратили ничье время.
Пожалуйста, дайте мне знать, если есть дополнительная информация, которую я могу предоставить, чтобы помочь вам помочь мне.