如何在C#中读取和写入文件


69

我想同时读取和写入文件。这行不通。

static void Main(string[] args)
{
    StreamReader sr = new StreamReader(@"C:\words.txt");
    StreamWriter sw = new StreamWriter(@"C:\words.txt");
}

如何在C#中读取和写入文件?

Answers:


79

您只需要打开一个流就可以同时进行阅读和写作。

FileStream fileStream = new FileStream(
      @"c:\words.txt", FileMode.OpenOrCreate, 
      FileAccess.ReadWrite, FileShare.None);

10
FileShare.ReadWrite不是必需的,并且可能是不可取的,它将允许其他应用程序在使用文件时读取和写入文件。通常,在写入文件时,首选FileShare.None,以防止他人在使用文件时访问文件。
ScottS

@ScottS:我同意只要需要ReadWrite,就可以让构造函数确定共享模式。
塞缪尔

谢谢你们俩!你真的帮了我!
Yehonatan 2014年

68

不要忘记简单的路线:

    static void Main(string[] args)
    {
        var text = File.ReadAllText(@"C:\words.txt");
        File.WriteAllText(@"C:\words.txt", text + "DERP");
    }

14
@Copperpot:检查问题的要求。没有说关于锁定。而且,它也没有说硬盘崩溃或流星撞击中断的任何信息。

1
我认为这个问题暗示着“同时”。
约翰·阿特伍德

4
@JohnAtwood您知道他们对假设的看法。他从未选择正确的答案,所以我们永远不会真正知道。

@Copperpot:我的解决方案不是您的解决方案,您的问题与OP不同或至少有更多解释,但是说我的回答将会失败是不正确的。您可能使用错了,但这更多的是问题而不是答案。

37
var fs = File.Open("file.name", FileMode.OpenOrCreate, FileAccess.ReadWrite);
var sw = new StreamWriter(fs);
var sr = new StreamReader(fs);

...

fs.Close();
//or sw.Close();

关键是使用FileAccess.ReadWrite标志打开文件。然后,您可以使用初始FileStream创建所需的任何Stream / String / Binary Reader / Writer。


2

该线程似乎在回答您的问题:并发读写文件

基本上,您需要声明两个FileStream,一个用于读取操作,另一个用于写入操作。Writer Filestream需要以“附加”模式打开文件。


1

您可以尝试执行以下操作:每次运行此代码时,都会在bin-> debug文件夹中自动创建“ Filename.txt”文件,也可以指定文件的路径,例如:@“ C:/ ...”。您可以通过转到bin-> debug文件夹来检查“ Hello”的存在性

PS不要忘记在此代码段之后添加Console.Readline(),否则不会出现控制台。

TextWriter tw = new StreamWriter("filename.txt");
        String text = "Hello";
        tw.WriteLine(text);
        tw.Close();

        TextReader tr = new StreamReader("filename.txt");
        Console.WriteLine(tr.ReadLine());
        tr.Close();

0

@Ipsita制作了一个改进代码-用于异步读写文件I / O

readonly string logPath = @"FilePath";
...
public async Task WriteToLogAsync(string dataToWrite)
{
    TextReader tr = new StreamReader(logPath);
    string data = await tr.ReadLineAsync();
    tr.Close();

    TextWriter tw = new StreamWriter(logPath);
    await tw.WriteLineAsync(data + dataToWrite);
    tw.Close();
}
...
await WriteToLogAsync("Write this to file");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.