我需要从FileStream对象创建一个StreamWriter并将一些文本附加到该文件.假设正在使用的FileStream对象是使用FileMode.OpenOrCreate和FileAccess.ReadWrite创建的.我有:
using (FileStream fs = GetCurrentFileStream())
{
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine("StringToAppend");
sw.Flush();
}
Run Code Online (Sandbox Code Playgroud)
但是,这只是从头开始覆盖文件.如何移动到文件末尾?在创建FileStream之后,是否有一种方法可以将FileMode更改为Append,将FileAccess更改为Write?
编辑:如上所述,我需要使用FileStream对象执行此操作.来自Open existing file的答案,附加一行假设我可以从我没有的文件路径创建一个新的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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
GetCurrentFileStream用于几个不同的上下文,因此不能直接更改FileMode和FileAccess.我不希望仅针对这种情况创建单独版本的GetCurrentFileStream,这就是为什么我要问是否有一种方法可以跳转到流的末尾并在已经创建FileStream对象时附加一个字符串.
如果我理解正确,您希望将您的行附加到创建的文件:
using (FileStream fs = GetCurrentFileStream())
{
StreamWriter sw = new StreamWriter(fs, true);
sw.WriteLine("StringToAppend");
sw.Flush();
}
Run Code Online (Sandbox Code Playgroud)
使用StreamWriter构造函数的这个重载,您可以选择是附加文件还是覆盖它.
如果你展示你的方法实现,那将是非常酷的GetCurrentStream():
using (FileStream fileStream = new FileStream(fileName,FileMode.Append, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
{
sw.WriteLine(something);
}
Run Code Online (Sandbox Code Playgroud)
更新:
using (FileStream fs = GetCurrentFileStream())
{
StreamWriter sw = new StreamWriter(fs);
long endPoint=fs.Length;
// Set the stream position to the end of the file.
fs.Seek(endPoint, SeekOrigin.Begin);
sw.WriteLine("StringToAppend");
sw.Flush();
}
Run Code Online (Sandbox Code Playgroud)