使用从FileStream创建的StreamWriter,C#移动到文件末尾

EJS*_*EJS 3 c# filestream

我需要从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对象时附加一个字符串.

Ste*_*pUp 7

如果我理解正确,您希望将您的行附加到创建的文件:

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)

  • 从 FileStream 构造 StreamWriter 时,参数 `bool append` 不可用。至于GetCurrentStream(),它是循环的一部分,它根据算法找到需要修改的文件的文件名,然后在循环中执行尝试以在文件可用时立即锁定文件,因为会有多个进程试图访问这些文件。此外,附加到文件的操作并不总是会执行,其他时候读取文件或同时进行读写是必要的。返回一个 FileStream 对象留下了更多的选择来做什么。 (2认同)