С# — System.IO.IOException

У меня есть метод, который сохраняет текст из текстового поля в текстовый файл, но я получаю ошибку System.IO.IOException каждый раз, когда я выхожу из диалогового окна SaveFileDialog.

    static OpenFileDialog ofd = new OpenFileDialog();
    static SaveFileDialog sfd = new SaveFileDialog();
    static String cp;

    private void SaveClass() {
        sfd.DefaultExt = "txt";
        sfd.Filter = "Text Files | *.txt";
        if (sfd.ShowDialog() == DialogResult.OK) {
            cp = sfd.FileName;
            File.Create(cp);

            File.WriteAllLines(@cp, StudentTextBox.Text.Split(new String[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));

        }
    }

Visual Studio выделяет код, начинающийся с «File.WriteAllLines», и говорит, что именно здесь я получаю сообщение об ошибке. Спасибо.

Точное сообщение об ошибке:

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

Дополнительная информация: процесс не может получить доступ к файлу «C:\Users\ktfjulien\Documents\poop.txt», так как он используется другим процессом.

РЕДАКТИРОВАТЬ: Спасибо, я больше не получаю сообщение об ошибке, но все, что я сохраняю в текстовое поле, записывается в одну строку, независимо от того, разделен ли текст новыми строками или нет.


person ktfjulien    schedule 06.05.2016    source источник
comment
И сообщение об ошибке?   -  person Dovydas Šopa    schedule 06.05.2016


Ответы (3)


Вам не нужно делать File.Create(cp); для записи в файл. Это причина ошибки. Вместо этого напрямую выполните:

cp = sfd.FileName;
FileStream fs = File.OpenWrite(cp);

И если вы хотите использовать StreamWriter вместо FileStream, используйте FileStream в качестве входных данных для вашего StreamWriter.

StreamWriter sw = new StreamWriter(fs);

Или вы также можете напрямую использовать File.WriteAllLines, как показано, - не используйте File.Create:

if (sfd.ShowDialog() == DialogResult.OK) {
    cp = sfd.FileName;
    //File.Create(cp); //remove this

    File.WriteAllLines(@cp, StudentTextBox.Text.Split(new String[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));

}
person Ian    schedule 06.05.2016

Когда вы создаете файл с помощью File.Create(), этот файл уже используется File.Create(), вам нужно закрыть этот файл, прежде чем использовать его в другом месте, поэтому перед записью текста в файл закройте средство записи файла.

var file = File.Create(cp);
file.Close();

полное рабочее решение

static OpenFileDialog ofd = new OpenFileDialog();
static SaveFileDialog sfd = new SaveFileDialog();
static String cp;
private void SaveClass()
{
    sfd.DefaultExt = "txt";
    sfd.Filter = "Text Files | *.txt";
    if (sfd.ShowDialog() == DialogResult.OK)
    {
        cp = sfd.FileName;
        var file = File.Create(cp);
        file.Close();

        File.WriteAllLines(@cp, StudentTextBox.Text.Split(new String[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries));

    }
 }
person Mostafiz    schedule 06.05.2016

Вам не нужно создавать файл, File.WriteAllLines сделает это за вас (или очистит файл, если он существует):

  private void SaveClass() {
    sfd.DefaultExt = "txt";
    sfd.Filter = "Text Files | *.txt";

    if (sfd.ShowDialog() == DialogResult.OK) 
      File.WriteAllLines(sfd.FileName, StudentTextBox.Text
        .Split(new String[] { Environment.NewLine },
               StringSplitOptions.RemoveEmptyEntries));
  }
person Dmitry Bychenko    schedule 06.05.2016