C# 我可以同时对 StreamReader(fs) 和 StreamWriter(fs, append: true) 使用 FileStream 吗?
C# Can I use FileStream for StreamReader(fs) and StreamWriter(fs, append: true) at the same time?
所以基本上我在绞刑架上苦苦挣扎,我不知道如何解决第一个问题。这就是为什么我认为我可能会加入另一个功能;一种使用 FileStream
将单词添加到我的文本文件中的方法 StreamWriter
。 (我也有一个 StreamReader
,所以我可以看到它会选择什么随机词。)
尝试过的事情(全部:writer.WriteLine(text)
):
我尝试将 StreamWriter writer = new StreamReader(fs.ToString(), append: true)
与 FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
一起使用
我试过FileMode.Append
(因为我想追加),但这只适用于只写模式,我也需要阅读文本。
我尝试在没有 ToSting() 的情况下使用文件流,但这导致 "Cannot convert from 'System.IO.FileStream' to 'string'."
我试图在不同的程序中做同样的事情,但只用 StreamReader
和 FileStream
,但它仍然没有改变文本文件中的任何内容。
我真正希望它能做什么:
我希望该程序能够将字符串附加到文本文件,同时仍然能够读取所选单词。 (当您启动程序时,会从文本文件中随机选择一个词。)
对不起,如果这看起来很乱,这是我第一次在 Whosebug 上提问。
所以这与副本不同的原因是因为我想附加文件,而不是写入(覆盖)它。我尝试了与 "duplicate" 完全相同的 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";
}
}
}
我认为问题在于您有两个不同的 FileStreams 同时访问同一个文件,但这是行不通的。
一种方法是在使用 FileStreams 和 StreamWriters 后立即关闭它们,每次您需要访问文件时重新打开它。
要关闭 StreamWriter/FileStream,请使用:
StreamWriter.Close();
或文件流:
FileStream.Close();
您显然必须通过 FileStream 对象的名称替换 FileStream。
希望能帮到你
另一种方法是:
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
将每个单词写到一个新行中。这样,您将获得文件中每个单词的数组。
所以基本上我在绞刑架上苦苦挣扎,我不知道如何解决第一个问题。这就是为什么我认为我可能会加入另一个功能;一种使用 FileStream
将单词添加到我的文本文件中的方法 StreamWriter
。 (我也有一个 StreamReader
,所以我可以看到它会选择什么随机词。)
尝试过的事情(全部:writer.WriteLine(text)
):
我尝试将
StreamWriter writer = new StreamReader(fs.ToString(), append: true)
与FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None)
一起使用
我试过
FileMode.Append
(因为我想追加),但这只适用于只写模式,我也需要阅读文本。我尝试在没有 ToSting() 的情况下使用文件流,但这导致 "Cannot convert from 'System.IO.FileStream' to 'string'."
我试图在不同的程序中做同样的事情,但只用
StreamReader
和FileStream
,但它仍然没有改变文本文件中的任何内容。
我真正希望它能做什么: 我希望该程序能够将字符串附加到文本文件,同时仍然能够读取所选单词。 (当您启动程序时,会从文本文件中随机选择一个词。)
对不起,如果这看起来很乱,这是我第一次在 Whosebug 上提问。
所以这与副本不同的原因是因为我想附加文件,而不是写入(覆盖)它。我尝试了与 "duplicate" 完全相同的 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";
}
}
}
我认为问题在于您有两个不同的 FileStreams 同时访问同一个文件,但这是行不通的。 一种方法是在使用 FileStreams 和 StreamWriters 后立即关闭它们,每次您需要访问文件时重新打开它。
要关闭 StreamWriter/FileStream,请使用:
StreamWriter.Close();
或文件流:
FileStream.Close();
您显然必须通过 FileStream 对象的名称替换 FileStream。
希望能帮到你
另一种方法是:
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
将每个单词写到一个新行中。这样,您将获得文件中每个单词的数组。