【问题标题】:C# Can I use FileStream for StreamReader(fs) and StreamWriter(fs, append: true) at the same time?C# 我可以同时将 FileStream 用于 StreamReader(fs) 和 StreamWriter(fs, append: true) 吗?
【发布时间】:2019-06-17 02:31:22
【问题描述】:

所以基本上我一直在与刽子手作斗争,我不知道如何解决第一个问题。这就是为什么我认为我可以加入另一个功能;一种使用FileStream 将单词添加到带有StreamWriter 的单词文本文件中的方法。 (我也有一个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' 转换为 'string'。”

  4. 我尝试在不同的程序中做同样的事情,但只使用StreamReaderFileStream,但它仍然没有改变文本文件中的任何内容。

我实际上希望它会做什么: 我希望程序能够将字符串附加到文本文件,同时仍然能够读取所选单词。 (当您启动程序时,会从文本文件中随机选择一个单词。)

抱歉,如果这看起来很乱,这是我第一次在 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";
            }
        }              
    }      

【问题讨论】:

标签: c# append filestream streamreader streamwriter


【解决方案1】:

另一种方法是:

    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,就像示例中一样。这样,您将获得文件中每个单词的数组。

【讨论】:

  • 所以我没有获取所有文本,而是使用private static string[] words = reader.ReadToEnd().Split(','); 将其拆分为数组。与File.AppenAllText(path, "text");(顺便说一句非常聪明的方式)一起,它给出了错误:“进程无法访问文件'路径',因为它正在被另一个进程使用”
  • 我在另一个解决方案没有 StreamReader 中尝试了它并且它工作了,但现在我仍然坚持这个错误:'我......如此接近但到目前为止......
【解决方案2】:

我认为问题在于您有两个不同的 FileStreams 同时访问同一个文件,这是行不通的。 一种方法是在使用 FileStreams 和 StreamWriters 后立即关闭它们,并且每次需要访问文件时重新打开它。

要关闭 StreamWriter/FileStream,请使用:

StreamWriter.Close();

或者对于 FileStreams:

FileStream.Close();

您显然必须通过 FileStream 对象的名称替换 FileStream。

希望能帮到你。

【讨论】:

  • 我尝试使用using(){},但没有收到任何错误。唯一的事情是,当我使用我的StreamWriter 添加另一个单词时,它不会附加任何内容(它的作用:不在文件中添加相同的单词)。所以我的作家不工作,我不知道为什么,因为我遵循了你的指示以及帖子中的那些“重复”。
  • 当您的 StreamWriter 不工作时,您是否遇到任何异常?
  • “不在文件中添加相同的单词”是什么意思?
  • 文件里已经有一些预先写好的词,所以我没有一个词在文件里出现两次。当作者不工作时我得到的错误是“只能以只写模式附加”,但是当我将 FileMode 放在 .OpenOrCreate 上时,该错误就消失了
  • 我想如果你在 private static string[] words = reader.ReadToEnd().Split(','); 之后打电话给 reader.Close(); ,它应该可以工作。不过,您必须在此之后重新初始化 StreamReader。
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多