IOException: процесс не может получить доступ к файлу 'путь к файлу', потому что он используется другим процессом в консольном приложении на C #

Я запускаю Console_Application-A, в котором я вызываю другое Console_Application-B (в котором я создаю файл журнала для ошибки / исключения).

Но когда я запускаю Console_Application-B индивидуально, он работает правильно, но когда я запускаю Console_Application-A в это время, я получаю исключение, когда приложению необходимо записать ошибку в файл журнала (Error.txt).

IOException: процесс не может получить доступ к файлу Error.txt, потому что он используется другим процессом.

пожалуйста, помогите мне в этом вопросе.

Код для записи журнала ошибок

public static bool IsFileLocked(FileInfo file)
{
 FileStream stream = null;
 try
 {
 stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
 }
 catch (IOException)
 {
  return true;
 }
 finally
 {
  if (stream != null)
  stream.Close();
  }
  return false;
 }

catch (Exception e)
{
    string filePath =Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\Error.txt";

FileInfo FInfo = new FileInfo(filePath);
var FileState = IsFileLocked(FInfo);

while (FileState){
FileState = IsFileLocked(FInfo);
}
if (!FileState){
using (StreamWriter writer = new StreamWriter(filePath, true))
{
 writer.WriteLine("Message :" + e.Message + "<br/>" + Environment.NewLine + "StackTrace :" + e.StackTrace +"" + Environment.NewLine + "Date :" + DateTime.Now.ToString());
 writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
writer.Dispose();
}
}
}

person Riddhi Bhatt    schedule 21.12.2015    source источник
comment
Оба приложения обращаются к одному и тому же файлу одновременно?   -  person Sybren    schedule 21.12.2015
comment
добавьте свой код для записи в файл журнала.   -  person Akshey Bhat    schedule 21.12.2015
comment
Нет Оба приложения используют разные файлы   -  person Riddhi Bhatt    schedule 21.12.2015
comment
Сообщение об ошибке очень ясно, что вы пытаетесь получить доступ к файлу, и он недоступен, поскольку используется другим процессом. Вы не вставили код, но я предполагаю, что реализует IDisposable, и перенос кода внутри оператора using будет работать. Надеюсь, это поможет   -  person microtechie    schedule 21.12.2015
comment
Я добавил код также для записи в файл журнала, пожалуйста, проверьте его и помогите мне!   -  person Riddhi Bhatt    schedule 21.12.2015


Ответы (1)


Нет необходимости сначала проверять, заблокирован ли файл, а затем обращаться к нему, так как между проверкой и доступом какой-либо другой процесс все еще может заблокировать файл.

using System;
using System.IO;

class DirAppend
{
    public static void Main()
    {
        using (StreamWriter w = File.AppendText("log.txt"))
        {
            Log("Test1", w);
            Log("Test2", w);
        }

        using (StreamReader r = File.OpenText("log.txt"))
        {
            DumpLog(r);
        }
    }

    public static void Log(string logMessage, TextWriter w)
    {
        w.Write("\r\nLog Entry : ");
        w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
            DateTime.Now.ToLongDateString());
        w.WriteLine("  :");
        w.WriteLine("  :{0}", logMessage);
        w.WriteLine ("-------------------------------");
    }

    public static void DumpLog(StreamReader r)
    {
        string line;
        while ((line = r.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }
    }
}

Источник - https://msdn.microsoft.com/en-us/library/3zc0w663(v=vs.110).aspx

person microtechie    schedule 21.12.2015