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

时间:2012-09-08 19:42:38

标签: c# stream

我想将我的字符串插入文件的开头。但是在流编写器的开头没有附加功能。那我该怎么做呢?

我的代码是:

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();

但它似乎没有优化。那还有其他方法吗?

3 个答案:

答案 0 :(得分:9)

你快到了:

        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 :(得分:4)

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

  1. 使用临时名称
  2. 创建新文件
  3. 撰写新文字
  4. 附加文件中的旧文字
  5. 删除文件
  6. 重命名临时文件
  7. 它不会那么酷又快,但至少你不必为你现在使用的方法在内存中分配一个巨大的字符串。

    但是,如果您确定文件很小,比如长度不到几兆字节,那么您的方法并不是那么糟糕。

    但是你可以稍微简化你的代码:

    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);
    }
    

答案 2 :(得分:0)

这样的事情:

    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();
    }