C # Могу ли я использовать FileStream для StreamReader (fs) и StreamWriter (fs, append: true) одновременно? - PullRequest
0 голосов
/ 23 января 2019

Так что в основном я боролся с палачом и не мог понять, как решить первую проблему.Вот почему я подумал, что могу поставить другую функцию;метод добавления слова в мой текстовый файл слов с помощью StreamWriter с использованием FileStream.(У меня тоже есть StreamReader, поэтому я могу видеть, какое случайное слово оно выберет.)

Пытались (со всеми: writer.WriteLine(text)):

  1. Я пытался использовать StreamWriter writer = new StreamReader(fs.ToString(), append: true) с FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)

  2. Я пытался FileMode.Append (потому что я хочу добавить), но это работает только в режиме только для записи, и мне нужно прочитать тексттоже.

  3. Я пытался использовать файловый поток без ToSting (), но это привело к «Невозможно преобразовать из« System.IO.FileStream »в« строку »."

  4. Я пытался сделать то же самое в другой программе, но только с StreamReader и FileStream, но это ничего не изменило в текстовом файле.

То, что я на самом деле хотел бы, чтобы это делалось: я ожидаю, что программа сможет добавить строку в текстовый файл, все еще будучи в состоянии прочитать выбранное слово.(При запуске программы выбирается случайное слово из текстового файла.)

Извините, если это выглядит грязно, я впервые задаю вопрос по stackoverflow.

Так почему это отличаетсяиз дубликата, потому что я хочу добавить файл, а не писать (перезаписывать) его.Я попробовал точно такой же FileStream как «дубликат», но он только избавился от ошибки.Теперь я все еще застрял с неисправной StreamWriter.

Часть кода:

    private static FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
    private static StreamReader reader = new StreamReader(fs);

    private static string[] words = reader.ReadToEnd().Split(',');

    public static Random randomizer = new Random();
    private static int wordindex = randomizer.Next(0, words.Length);


    public string GetWord()
    {
        return words[wordindex]; //returns random value out of array = random woord
    }

`

И using для StreamWriter:

public string AddWordToFile(string word)
    {
        using (StreamWriter writer = new StreamWriter(fs.ToString(), append: true))
        {
           //bool ExistsInFile = false;
            for (int i = 0; i < words.Length; i++)
            {
                if (words.Contains(word))
                {
                    //ExistsInFile = true;
                    return "The word '" + word + "' already exists in the textfile.";
                }
            }
            if (!words.Contains(word))
            {
                //ExistsInFile = false;
                writer.WriteLine("," + word);
                writer.Close();
                return word + " added.";
            }
            else
            {
                return "Whoops, something went wrong :'I";
            }
        }              
    }      

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Еще один способ сделать это был бы так:

    static void ReadAndWrite()
    {
        string file = File.ReadAllText(@"C:\whatever.txt"); //read C:\whatever.txt
        File.AppendAllText(@"C:\whatever.txt", "Text to append"); //append "Text to append" to C:\whatever.txt
    }

Я протестировал это, и он отлично работает на моем ПК.

Может быть, это поможет вам.

Редактировать: Это намного проще и читает каждую строку в файле в массив строк:

    static void ReadAndWrite()
    {
        string[] words = File.ReadAllLines(@"C:\whatever.txt");
        File.AppendAllText(@"C:\whatever.txt", "Word to append\r\n"); //append "Word to append" in a new Line to C:\whatever.txt
    }

Чтобы получить массив слов, запишите каждое слово в новую строку с помощьютакже добавляя \r\n после каждого слова, как в примере.Таким образом, вы получите массив каждого слова в вашем файле.

0 голосов
/ 24 января 2019

Я думаю, что проблема в том, что у вас было два разных FileStreams, обращающихся к одному и тому же файлу одновременно, что не работает. Один из способов сделать это - закрыть FileStreams и StreamWriters сразу после их использования, и каждый раз, когда вам понадобится получить доступ к файлу, снова открывайте его.

Чтобы закрыть StreamWriter / FileStream, используйте:

StreamWriter.Close();

или для FileStreams:

FileStream.Close();

Вам, очевидно, придется заменить FileStream через Имя вашего объекта FileStream.

Я надеюсь, что смогу вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...