Что-то отсутствует при записи в текстовый файл

#c#

#c#

Вопрос:

Я просто хочу иметь возможность записывать путь к определенным файлам в текстовый файл. У меня есть следующее для ведения журнала.

 static void LogFile(string lockedFilePath)
    {
        Assembly ass = Assembly.GetExecutingAssembly();
        string workingFolder = System.IO.Path.GetDirectoryName(ass.Location);
        string LogFile = System.IO.Path.Combine(workingFolder, "logFiles.txt");

        if (!System.IO.File.Exists(LogFile))
        {
            using (System.IO.FileStream fs = System.IO.File.Create(LogFile))
            {
                using (System.IO.StreamWriter sw = new StreamWriter(fs))
                {
                    sw.WriteLine(lockedFilePath);   
                }
            }
        }
        else
        {
            using (System.IO.FileStream fs = System.IO.File.OpenWrite(LogFile))
            {
                using (System.IO.StreamWriter sw = new StreamWriter(fs))
                {
                    sw.WriteLine(lockedFilePath);
                }
            }
        }
    }
  

но если я вызову это в консольном приложении, подобном этому

 foreach (string f in System.IO.Directory.GetFiles(@"C:AASource"))
            {
                Console.WriteLine("Logging : "   f);
                LogFile(f);
            }
            Console.ReadLine();
  

Единственный файл, который указан в результирующем текстовом файле, является последним файлом в каталоге.
Что я делаю не так?

Ответ №1:

Вместо System.IO.File.OpenWrite(LogFile) используйте System.IO.File.AppendText(LogFile) . При использовании OpenWrite вы будете перезаписывать содержимое тем, на чем вы пишете.

Кроме того, ваша if инструкция ( if (!System.IO.File.Exists(LogFile)) ) не требуется. AppendText OpenWrite ), если уж на то пошло, создаст файл, если он не существует. Это означает, что вам может просто сойти с рук выполнение кода в else предложении.

Ответ №2:

Вам нужно открыть файл в режиме добавления. В противном случае вы удаляете все, что было в файле до этого.

Вот код файла журнала, который я использую, если вы хотите увидеть другие примеры.

Ответ №3:

Файл.AppendText MSDN

Ответ №4:

Вы перезаписываете файл каждый раз, когда вызываете метод LogFile. Вы можете использовать перегрузку для StreamWriter, которая позволяет добавлять в конец файла:

 void LogFile(string lockedFilePath)
{
    Assembly ass = Assembly.GetExecutingAssembly();
    string workingFolder = System.IO.Path.GetDirectoryName(ass.Location);
    string LogFile = System.IO.Path.Combine(workingFolder, "logFiles.txt");

    using (System.IO.StreamWriter sw = new StreamWriter(LogFile, true))
    {
        sw.WriteLine(lockedFilePath);   
    }
}
  

Ответ №5:

 static void LogFile(string lockedFilePath)
        {
            Assembly ass = Assembly.GetExecutingAssembly();
            string workingFolder = System.IO.Path.GetDirectoryName(ass.Location);
            string LogFile = System.IO.Path.Combine(workingFolder, "logFiles.txt");

            System.IO.File.AppendAllText(LogFile, System.Environment.NewLine   lockedFilePath);

        }
  

Ответ №6:

Вы должны очистить и закрыть StreamWriter. Если записан только последний файл, это означает, что вы просто перезаписываете то, что у вас было.

Увидимся.

Комментарии:

1. Это не требуется, в конце using он должным образом очищается и закрывается.