【发布时间】:2015-11-12 12:29:13
【问题描述】:
我需要从 FileStream 对象创建一个 StreamWriter 并将一些文本附加到 文件。假定正在使用的 FileStream 对象是使用 FileMode.OpenOrCreate 和 FileAccess.ReadWrite 创建的。我有:
using (FileStream fs = GetCurrentFileStream())
{
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("StringToAppend");
sw.Flush();
}
但是,这只是从头开始覆盖文件。如何移动到文件末尾?有没有办法在创建 FileStream 后将 FileMode 更改为 Append 并将 FileAccess 更改为 Write?
编辑:如上所述,我需要使用 FileStream 对象来执行此操作。 Open existing file, append a single line 的答案假设我可以从我没有的文件路径创建一个新的 StreamWriter。
编辑 2:添加了 GetCurrentFileStream() 的截断版本。
public static FileStream GetCurrentFileStream()
{
String fileName = getFileName();
FileStream fs = OpenFileWhenAvailable(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
public static FileStream OpenFileWhenAvailable(String fileName, FileMode fileMode, FileAccess fileAccess, FileShare fileShare)
{
int tries = 0;
int timeout = 10 * 1000;
while (true)
{
tries++;
try
{
return new FileStream(fileName, fileMode, fileAccess, fileShare);
}
catch (IOException ex)
{
if (tries * 100 > timeout)
{
return null;
}
else
{
System.Threading.Thread.Sleep(100);
}
}
}
}
GetCurrentFileStream 用于多种不同的上下文,因此不能直接更改 FileMode 和 FileAccess。我不希望仅针对这种情况制作单独的 GetCurrentFileStream 版本,这就是为什么我要问是否有办法在 FileStream 对象已经创建时跳转到流的末尾并附加一个字符串。
【问题讨论】:
-
不一样。我需要从现有的 FileStream 对象中执行此操作。
-
在
sw.WriteLine之前尝试fs.Seek(0, SeekOrigin.End)。 -
除了@MarkShevchenko 所说的,
Seek在你创建StreamWriter之前。寻找底层流是未记录的行为,它可能会在未来中断,不管它目前是否有效。
标签: c# filestream