如何使用Stream Writer写入文件的开头



我想将字符串插入到文件的开头。但在流写入程序的开头并没有可附加的函数。那么我该怎么做呢?

我的代码是:

string path = Directory.GetCurrentDirectory() + "\test.txt";
StreamReader sreader = new StreamReader(path);
string str = sreader.ReadToEnd();
sreader.Close();
StreamWriter swriter = new StreamWriter(path, false);
swriter.WriteLine("example text");
swriter.WriteLine(str);
swriter.Close();

但它似乎并没有优化。还有其他办法吗?

您已接近目标:

        string path = Directory.GetCurrentDirectory() + "\test.txt";
        string str;
        using (StreamReader sreader = new StreamReader(path)) {
            str = sreader.ReadToEnd();
        }
        File.Delete(path);
        using (StreamWriter swriter = new StreamWriter(path, false))
        {
            str = "example text" + Environment.NewLine + str;
            swriter.Write(str);
        }

如果您不必考虑其他进程写入同一文件,并且您的进程具有该目录的创建权限,那么最有效的处理方法是:

  1. 使用临时名称创建新文件
  2. 编写新文本
  3. 附加文件中的旧文本
  4. 删除文件
  5. 重命名临时文件

它不会那么酷和快,但至少你不必为你现在使用的方法在内存中分配一个巨大的字符串。

但是,如果您确信文件会很小,比如不到几兆字节长,那么您的方法也没那么糟糕。

然而,您可以稍微简化您的代码:

public static void InsertText( string path, string newText )
{
    if (File.Exists(path))
    {
        string oldText = File.ReadAllText(path);
        using (var sw = new StreamWriter(path, false))
        {
            sw.WriteLine(newText);
            sw.WriteLine(oldText);
        }
    }
    else File.WriteAllText(path,newText);
}

对于大文件(即>几个MB)

public static void InsertLarge( string path, string newText )
{
    if(!File.Exists(path))
    {
        File.WriteAllText(path,newText);
        return;
    }
    var pathDir = Path.GetDirectoryName(path);
    var tempPath = Path.Combine(pathDir, Guid.NewGuid().ToString("N"));
    using (var stream = new FileStream(tempPath, FileMode.Create, 
        FileAccess.Write, FileShare.None, 4 * 1024 * 1024))
    {
        using (var sw = new StreamWriter(stream))
        {
            sw.WriteLine(newText);
            sw.Flush();
            using (var old = File.OpenRead(path)) old.CopyTo(sw.BaseStream);
        }
    }
    File.Delete(path);
    File.Move(tempPath,path);
}

类似这样的东西:

    private void WriteToFile(FileInfo pFile, string pData)
    {
        var fileCopy = pFile.CopyTo(Path.GetTempFileName(), true);
        using (var tempFile = new StreamReader(fileCopy.OpenRead()))
        using (var originalFile = new  StreamWriter(File.Open(pFile.FullName, FileMode.Create)))
        {
            originalFile.Write(pData);
            originalFile.Write(tempFile.ReadToEnd());
            originalFile.Flush();
        }
        fileCopy.Delete();
    }

相关内容

  • 没有找到相关文章

最新更新