C# 读取和写入同一流中的文件

C# 读取和写入同一流中的文件,c#,C#,我正在尝试读取和写入同一个文件,这样其他程序就无法访问这两个文件: FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); StreamReader sr = new StreamReader(fs); StreamWriter sw = new StreamWriter(fs); newString

我正在尝试读取和写入同一个文件,这样其他程序就无法访问这两个文件:

  FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);               
  StreamReader sr = new StreamReader(fs);
  StreamWriter sw = new StreamWriter(fs);
  newString = sr.ReadToEnd() + "somethingNew";
  sw.Write(newString);
  fs.Close();
该文件从未写入。如果我调试,我可以看到读卡器设法获取文件的内容,但写卡器似乎无法写入文件。什么也没发生


我一直在看和我的一样的。但是我无法让它工作。

@EJS是一种简单的静态方法,如果不存在,您可以使用它创建新文件,如果存在,则可以写入同一文件

简单用法

string path = @"C:\SomePath\Name.txt";

if (!System.IO.File.Exists(path))
{
    WriteAndOrAppendText(path, "File Created");
}
else if (System.IO.File.Exists(path))
{
    WriteAndOrAppendText(path, "New Boot.");             
}

private static void WriteAndOrAppendText(string path, string strText)
{
    if (!File.Exists(path))
    {
        using (StreamWriter fileStream = new StreamWriter(path, true))
        {
            fileStream.WriteLine(strText);
            fileStream.Flush();
            fileStream.Close();
        }
    }
    else
    {
        using (StreamWriter fileStream2 = new StreamWriter(path, true))
        {
            fileStream2.WriteLine(strText);
            fileStream2.Flush();
            fileStream2.Close();
        }
    }
}
只需更改文件,就可以使用
sw.Flush()关闭流之前。比如:

string filePath = "test.txt";
FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
StreamReader sr = new StreamReader(fs);
StreamWriter sw = new StreamWriter(fs);
newString = sr.ReadToEnd() + "somethingNew";
sw.Write(newString);
sw.Flush(); //HERE
fs.Close();

您可能会看到这篇文章(打开多个流进行读写)

如上所述-只需添加Flush()命令,即可将流中保存的数据写入文件。在一篇评论中,您提到您以前使用过“using”语句,但这不起作用

简单地说,原因如下:

  • using语句会自动调用Flush(),因此您没有 对

  • 当您处置StreamReader(或StreamWriter)时(如通过使用“using”语句),内部流对象也会被处置,并且您会丢失流的句柄


  • 为了能够创建一个文件、附加到该文件并读取其中的数据,同时仍允许应用程序写入该文件(我相信您正在尝试这样做),我创建了一个设置:

        string path = @"C:\SomePath\MyLogFile.txt";
    
        public static string Log(string Message)
        {
            try
            {
                if (File.Exists(path) == false)
                    File.Create(path).Close();  // need this .Close()!!!
    
                logCounter++;
                string logString = logCounter + "   " + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ": " + Message + Environment.NewLine;
    
                using (FileStream fs = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
                {
                    using (StreamWriter sw = new StreamWriter(fs))
                    {
                        sw.Write(logString);
                    }
                }
    
                return logString; // only necessary so we can return an error in the Exception block
            }
            catch (Exception ex)
            {
                return "Logger:  Cannot log data. " + ex.ToString();
            }
        }
    
    实际上需要使用
    FileAccess.Write
    如果您使用
    FileMode.Append
    -而不是能够使用
    FileAccess.ReadWrite
    -但是我发现这并不重要,因为写入的内容都会被关闭并刷新到文件中,我仍然可以打开文件并读取它(它不会被锁定和空白)使用这些。我有
    sw.Write()
    ,因为我有
    Environment.NewLine
    ,我把它添加到我的
    logString
    ,但是如果我想的话,我可以做
    sw.WriteLine()
    并删除它


    有一个警告:
    File.Exists()
    如果路径很长,就会出现问题-记不起限制,但要知道有一个限制,所以不要将正在写入的文件放在几层深处。越少越好。

    会出现什么错误?请尝试
    sw.Flush()
    写入之后
    。将
    流读取器
    流写入器
    附加到同一个流(只有一个
    位置
    值)很可能会引起各种各样的恶作剧。我会在同一个文件上打开两个流,一个读流和一个写流。我知道你可能喜欢这种方法,但为什么不在附加模式下打开一个文件,这样它将始终附加到文件中,或者在需要时创建一个新的文件?@Joshuabaker最好编写一个方法,该方法
    创建文件,同时使用bool覆盖/or不
    那么在该方法中,如果文件存在,则写入/并附加相同的内容。.我发布了一个简单的工作示例
    if
    &
    else
    writeAndAppendText
    方法中的代码有什么区别?可能最好使用
    StreamReader
    StreamWriter
    放在
    中de>语句,而不是显式调用
    Close
    ,以便在出现问题时将问题清理干净。@spender我完全同意,但这是一种快速而肮脏的方法,有助于OP理解逻辑流。这样做还可以避免让
    臭名昭著的文件已经出现在用户错误中
    ,并将流包装在<代码>使用
    语句将为您调用
    Flush()
    。您也会知道它们正在被关闭并一目了然地处理。添加Flush有效。我以前使用过它,但这不起作用。