L48 Ответов: 1

Как писать на существующий файл, читая в существующий файл тоже с помощью C#


Я построил форму приложения windows с visual c#, которая читает существующий файл (читает все строки и печатает только строки, которые включают в себя "неактивное"слово) и записывает в существующий файл (newoverride.txt).

Но ничего не печатает в выходном файле.

Можете ли вы помочь, как я могу это исправить?

Что я уже пробовал:

string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
          
            StreamReader file = new StreamReader(path);
            List<string> Inactive = new List<string>();
            while (file.EndOfStream != true)
            {
                string s = file.ReadLine();
                Match m = Regex.Match(s, "(?<=Inactive)(.)+");
                if (m.Success)
                {
                    Inactive.Add(m.ToString());
                }

                
                {

                    s = String.Empty; 
                }
                string path2 = path + "@\newoverride.txt";
             
                using (StreamWriter outputFile = new StreamWriter(path2))
                    

                    label2.Text = "File is converted ";
            }
        }
    }
}

1 Ответов

Рейтинг:
0

OriginalGriff

Цитата:
ничего не печатая в выходном файле.
Ну...это не так.
И это потому, что вы не говорите ему об этом.
Вы открываете выходной поток:
using (StreamWriter outputFile = new StreamWriter(path2))


label2.Text = "File is converted ";
Но вы ничего в него не вписываете.
Даже если вы это сделали, выходной поток открывается внутри вашего цикла - поэтому каждый раз, когда вы открываете его, вы выбрасываете любое предыдущее содержимое.
Откройте выходной поток вне цикла и запишите его внутри цикла или запишите всю неактивную коллекцию, содержащую строки, которые вам нужно записать после завершения цикла.

И кстати: это не дает вам того, чего вы хотели:
string path2 = path + "@\newoverride.txt";
Это дает вам строку, которая начинается с atsign и новой строки... Вероятно, вы имели это в виду:
string path2 = path + @"\newoverride.txt";
Но даже в этом случае есть вероятность, что он потерпит неудачу - запись в корневую папку вашего загрузочного диска ограничена и, скорее всего, потерпит неудачу.


L48

Да, именно так, генерируется ошибка:доступ к пути 'C:\Users\xxxxx\Documents-это отрицается.
Не могли бы вы записать фиксированный код, пожалуйста?
Я перепробовал много способов :/

OriginalGriff

Нет - потому что нет никакого "фиксированного кода", чтобы вылечить нарушение доступа.
То, что ошибка - совершенно ясно - говорит: "У вас нет полномочий для доступа к этой папке". Код не может вылечить это, вам нужно выбрать папку, к которой у вас *есть* доступ!

Вы можете посмотреть здесь:
https://www.codeproject.com/Tips/370232/Where-should-I-store-my-data
Это может помочь.

L48

Я понял, большое вам спасибо.
ps: можете ли вы взглянуть на эту другую ошибку (использование List<t> требует аргумента 1 типа), что я должен добавить/изменить?
строка path = Environment.GetFolderPath(Environment.Специальная папка.Мои документы);
строка path2 = path + @"\newoverride.txt";
строка s;

Файл StreamReader = новый StreamReader(путь);
Список<строка>, который не активен = новый список<строка&ГТ;();
в то время как (файл.EndOfStream != true)
{
s = файл.Линия чтения();
Совпадение m = регулярное выражение.Совпадение(s, "(?<=неактивно)(.)+");
если (m.успех)
{
Неактивный.Добавить(м. Метод toString());
}

}


foreach (список l в неактивном состоянии)
{
используя (писатель модулю записи StreamWriter = новая модулю записи StreamWriter(путь2))
{

писатель.WriteLine(l);

}
}

OriginalGriff

Технически это другой вопрос, поэтому он должен быть опубликован под новым постом QA.
Но... это же совершенно очевидно!

foreach (список l в неактивном состоянии)

Inactive объявляется как список строк, и foreach обрабатывает каждый объект в коллекции. Поэтому вам нужно указать тип переменной teh "каждый элемент" в foreach, а не тип коллекции teh - он уже знает это. Inactive - это коллекция, и она содержит строки, поэтому вам нужно объявить l как тип элемента = строка:

foreach (строка l в неактивном состоянии)

В этом есть смысл?