StreamWriter не записывает в существующий файл

Я пытаюсь написать текст в файл с помощью StreamWriter и получить путь к файлу из выбранной папки FolderDialog. Мой код работает нормально, если файл еще не существует. но если файл уже существует, выдается исключение, что файл используется другим процессом.

using(StreamWriter sw = new StreamWriter(FolderDialog.SelectedPath + @"\my_file.txt")
{
    sw.writeLine("blablabla");
}

Теперь, если я напишу так:

using(StreamWriter sw = new StreamWriter(@"C:\some_folder\my_file.txt")

он отлично работает с существующим файлом.


person Community    schedule 04.09.2009    source источник
comment
Что возвращает FolderDialog.SelectedPath? Это просто какая-то_папка или c:\some_folder\ ?   -  person Sathyajith Bhat    schedule 04.09.2009


Ответы (5)


Это может быть связано с тем, как вы комбинируете свой путь и имя файла. Попробуйте это:

using(StreamWriter sw = new StreamWriter(
    Path.Combine(FolderDialog.SelectedPath, "my_file.txt"))
{
    sw.writeLine("blablabla");
}

Кроме того, убедитесь, что значение FolderDialog.SelectedPath не является пустым. :)

person Jon Tackabury    schedule 04.09.2009

Файл уже используется, поэтому его нельзя перезаписать. Однако учтите, что это сообщение не всегда соответствует действительности — на самом деле файл может использоваться вашим собственным процессом. Проверьте свои модели использования.

person Av Pinzur    schedule 04.09.2009

Это дешевый ответ, но вы пробовали этот обходной путь?

string sFileName= FolderDialog.SelectedPath + @"\my_file.txt";
using(StreamWriter sw = new StreamWriter(sFileName))
{
  sw.writeLine("blablabla");
}

Еще я бы посоветовал проверить, что FolderDialog.SelectedPath + "\my_file.txt" равен жестко запрограммированному пути "C:\some_folder\my_file.txt".

person Mayo    schedule 04.09.2009

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

Для этого запустите Process Explorer, нажмите Ctrl+F, введите имя файла и нажмите «Найти».

Кроме того, лучший способ выполнить эту задачу выглядит следующим образом:

using(StreamWriter sw = File.AppendText(Path.Combine(FolderDialog.SelectedPath, @"my_file.txt")))

EDIT: НЕ ставьте косую черту во втором аргументе Path.Combine.

person SLaks    schedule 04.09.2009

Попробуй это

 using (StreamWriter sw = File.AppendText(@"C:\some_folder\my_file.txt"))
    {
          sw.writeLine("blablabla");
    }

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

 string path = @"C:\some_folder\my_file.txt";
        if (!File.Exists(path))
        {
            // Create a file to write to.
            using (StreamWriter sw = File.CreateText(path))
            {
                //once file was created insert the text or the columns
                sw.WriteLine("blbalbala");

            }
        }
        // if already exists just write
using (StreamWriter sw = File.AppendText(@"C:\some_folder\my_file.txt"))
    {
          sw.writeLine("blablabla");
    }
person Herbert Sales Santos    schedule 05.06.2017