C#读取和写入同一个文件

C#读取和写入同一个文件,c#,file,C#,File,我正在经历一个循环,每次运行我都希望打开一个txt/csv文件并搜索循环中指定的值。如果该值存在于txt文件中,我希望在该行中写入该值 这能做到吗?我一直在玩StreamReader和StreamWriter,但从未真正成功地读写同一个文件 我一开始试过这个,但是很明显StreamReader使文件“繁忙”,因此StreamWriter无法访问它 private void WriteTempTXT() { StreamReader sr = new StreamReader(@tmpf

我正在经历一个循环,每次运行我都希望打开一个txt/csv文件并搜索循环中指定的值。如果该值存在于txt文件中,我希望在该行中写入该值

这能做到吗?我一直在玩StreamReader和StreamWriter,但从未真正成功地读写同一个文件

我一开始试过这个,但是很明显StreamReader使文件“繁忙”,因此StreamWriter无法访问它

private void WriteTempTXT()
{

    StreamReader sr = new StreamReader(@tmpfile);
    StreamWriter sw = new StreamWriter(@tmpfile);

}

有什么方法可以做到这一点吗?

首先,您需要跟进这一点

然后使用这个类

string path = Server.MapPath("Twitter Overview Report1.csv"); 
    using (CsvFileReader reader = new CsvFileReader(path))
    {
        CsvRow row = new CsvRow();
        while (reader.ReadRow(row))
        {
            foreach (string s in row)
            {
                string s_row = row[0].ToString();
                s_row.Replace("mahmoude", "Ghandour");
            }
            Console.WriteLine();
        }
    }
    using (CsvFileWriter writer = new CsvFileWriter(path))
    {

    }

写入CSV文件中的行时存在两个问题:

  • 文件不是基于行的。如果新行的编码数据与原始行的字节数完全相同,则只能替换文件中的一行

  • CSV数据不是基于行的。换行符用作记录分隔符,但作为一个值也可以包含换行符,您无法可靠地逐行读取CSV文件(除非在特殊情况下,您确定没有任何值会包含新行)

  • 如果新行的编码数据长度与旧行不同,则必须重写文件的其余部分,以便为添加的字节或删除未使用的字节腾出空间


    通常的方法是读取整个文件并将其解析为记录,更改记录,然后将整个文件写回。

    首先,可以这样做。您可以创建具有读/写访问权限的
    文件流
    ,然后直接写入流。以下是概念证明:

    using (var v = new StreamWriter(File.Create("a.txt"))) {
        v.WriteLine("1234A67890");
    }
    
    FileStream fs = new FileStream("a.txt", FileMode.Open, FileAccess.ReadWrite);
    while (fs.ReadByte() != 'A') {} // Dangerous.  Loops until 'A' found, infinite loop if none.
    fs.Position--;
    fs.WriteByte((byte)'5');
    fs.Close();  // contents of a.txt now 1234567890
    
    然而,这种方法存在一些基本问题:

  • 文件损坏的风险。如果程序崩溃(或断电等),文件可能处于不一致的状态
  • 无法始终如一地使用
    StreamReader
    /
    StreamWriter
    两者都将数据存储在内部缓冲区中,如果同时写入和读取底层流,则内部缓冲区可能会失效。您可以调用,但MSDN指出“此方法会降低性能,只有在绝对必要时才应调用。”
  • 复杂性。在文件中插入文本是一项成本高昂的操作,需要在内存中移动所有后续数据
  • 相反,除非压倒性的考虑(例如,文件相对于可用的存储空间是巨大的),您可能需要考虑这种方法:

  • 创建一个新的临时文件。(为此,您可以使用
    System.IO.Path.GetTempFileName()
  • 将现有文件读入临时文件,进行必要的更改。(使用
    StreamReader
    读取旧文件,使用
    StreamWriter
    写入新文件。)
  • 用临时文件覆盖现有文件

  • 这种方法在概念上是相似的,但不会产生同时读取和写入同一流的风险和复杂性。

    它的可能重复并不能完全满足我的需要。正如我所说的,我只是不想在它的末尾添加数据,而是更新行。请参阅此[链接][1]。这应该可以帮助你[1]:文件有多大?从整体上看,逐行处理,然后写入更改是最明显、最快和最消耗内存的方式。这样做15000次,我们在这里讨论的性能方面是什么?我不同意(2),在处理csv文件时,您可以安全地使用
    ReadLine()
    。但不确定不同的编码。@Sinatr:你错了。例如,如果您尝试读取记录
    1,2,“Hello\r\nworld”
    ,则
    ReadLine
    方法将为您提供部分记录
    1,2,“您好
    @user3218338:读取和写入15000个文件自然需要很长时间。如果你一遍又一遍地修改同一个文件,那么你应该自然地读一次,做所有的修改,然后在处理完后再写回去。@Guffa,哦,没有想到换行符是内容的一部分(而且似乎在正确读写方面有问题)。那么是的,你是对的。我将字符串中的换行符替换为
    。替换(“\xd\xa”,“\\n”)
    ,然后返回
    。替换(“\\n”,“\xd\xa”)