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

时间:2015-11-10 15:18:40

标签: c#

我尝试以某种方式读取和写入同一文件,以便其他程序无法访问其中的文件:

  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();

永远不会写入文件。如果我调试我可以看到读者设法获取文件的内容,但编写器似乎无法写入该文件。没有任何事情发生。

我一直在看this question这似乎与我的相同。但是,我无法让它发挥作用。

4 个答案:

答案 0 :(得分:3)

只需Flush您对文件的更改,在关闭流之前请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();

你可能会看到这篇文章simultaneous read-write a file in C#(打开多个流来阅读和写作)

答案 1 :(得分:1)

如上所述 - 只需添加Flush()以强制将流中保存的数据写入文件。在评论中,您提到过您以前使用过'使用'声明,但这没有奏效。

简要说明原因:

  1. using语句会自动调用Flush(),因此您无法使用 到。

  2. 当您丢弃StreamReader(或StreamWriter)时 - 例如使用'使用' statement - 内部流对象也被丢弃,你丢失了流的句柄。

答案 2 :(得分:0)

@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();
        }
    }
}

答案 3 :(得分:0)

为了能够创建文件,附加到文件并读取其中的数据,同时仍允许应用程序对其进行写入(正如我相信您正在尝试的那样),这是我创建的设置:

    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()会出现问题-记不住限制了,但是只知道有一个限制,所以不要将要写入的文件放在多个层次上。越少越好。