@skvoshiz

Как избежать ошибки Необработанное исключение типа «System.IO.IOException» в mscorlib.dll?

Здравствуйте, иногда вылетает данная ошибка:
Необработанное исключение типа "System.IO.IOException" в mscorlib.dll
8057d4a2bdd344c9b84fae39f37755ae.JPG
Сам код:
using System;
using System.IO;
 
namespace TurboBotNew
{
    public static class Log
    {
        static string s_logFile = System.IO.Directory.GetCurrentDirectory() + "\\log.txt";
        static int i_lastLog = 0;
 
        public static void Write(string message)
        {
            string TimeNow = DateTime.Now.ToString("HH:mm:ss");
            message = "[" + TimeNow + "] " + message + "\n";
            File.AppendAllText(s_logFile, message);
 
        }
 
        public static void Close()
        {
            if (System.IO.File.Exists(s_logFile))
                System.IO.File.Delete(s_logFile);
        }
 
        public static string Read(string s_log)
        {
            if (!System.IO.File.Exists(s_logFile))
                Write("Создание лога");
            var mass = System.IO.File.ReadAllLines(s_logFile);
            string s_message = "";
            for (int i = mass.Length - 1; i > i_lastLog; i--)
            {
                s_message = mass[i] + Environment.NewLine + s_message;
            }
            i_lastLog = mass.Length - 1;
 
            return s_log + s_message;
        }
    }
}

Как в данном коде избежать этой ошибки?
  • Вопрос задан
  • 5622 просмотра
Решения вопроса 1
@mayorovp
Ошибка возникает потому что вы пытаетесь открыть файл лога из нескольких потоков одновременно. Или вы просто одновременно открыли его в текстовом редакторе.

PS
Совет номер 1: откройте для себя NLog
Совет номер 2: никогда не делайте вот так в цикле
s_message = mass[i] + Environment.NewLine + s_message;
- для таких вещей есть StringBuilder, который работает быстрее.
Совет номер 3: А еще лучше - вместо таких циклов использовать удобный метод
s_message  = string.Join(Environment.NewLine, mass)

Совет номер 4: Еще лучше - использовать File.ReadAllText вместо File.ReadAllLines в таких случаях.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Используйте StreamWriter для записи.
Открыли один раз при первой попытке записи и закрыли перед завершением программы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы