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有效。我以前使用过它,但这不起作用。