我尝试以某种方式读取和写入同一文件,以便其他程序无法访问其中的文件:
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这似乎与我的相同。但是,我无法让它发挥作用。
答案 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()以强制将流中保存的数据写入文件。在评论中,您提到过您以前使用过'使用'声明,但这没有奏效。
简要说明原因:
using语句会自动调用Flush(),因此您无法使用 到。
当您丢弃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()
会出现问题-记不住限制了,但是只知道有一个限制,所以不要将要写入的文件放在多个层次上。越少越好。