如何在c#中截断文件?

问题描述 投票:0回答:8

我正在使用 Trace.Writeln() 函数将 C# 程序完成的操作写入文件中。但文件变得太大。当这个文件增长到1MB时如何截断它?

TextWriterTraceListener traceListener = new TextWriterTraceListener(File.AppendText("audit.txt"));
Trace.Listeners.Add(traceListener);
Trace.AutoFlush = true;

上面的块应该添加什么

c# .net file truncate
8个回答
41
投票

尝试使用 FileStream.SetLength

FileStream fileStream = new FileStream(...);
fileStream.SetLength(sizeInBytesNotChars);

12
投票

关闭文件,然后使用 FileMode.Truncate 重新打开它。

一些日志实现会在重新打开旧文件之前以旧名称对其进行存档,以保留更大的数据集,而不会导致任何文件变得太大。


6
投票

与尝试自己执行此操作相反,我真的建议使用诸如 log4net 之类的东西;它内置了很多此类有用的功能。


6
投票

当文件超过 500000 字节时,它将从文件中删除开头的 250000 字节,因此剩余文件的长度为 250000 字节。

FileStream fs = new FileStream(strFileName, FileMode.OpenOrCreate);
        if (fs.Length > 500000)
        {
            // Set the length to 250Kb
            Byte[] bytes = new byte[fs.Length];
            fs.Read(bytes, 0, (int)fs.Length);
            fs.Close();
            FileStream fs2 = new FileStream(strFileName, FileMode.Create);
            fs2.Write(bytes, (int)bytes.Length - 250000, 250000);
            fs2.Flush();
        } // end if (fs.Length > 500000) 

2
投票

这样做:

if(new FileInfo("<your file path>").Length > 1000000)
{
    File.WriteAllText("<your file path>", "");
}

1
投票

如果您不想保留内容,或将它们移动到跟踪周期更新(无论是按天还是其他周期长度)的辅助文件中,我建议使用这种简单的方法重写文件:

private void Truncate(readFile)     // to clear contents of file and note last time it was cleared
{
    string readFile = readPath + ".txt";
    string str = string.Format("{0} : Truncated Contents", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));
    using (StreamWriter truncate = new StreamWriter(readFile))
    {
        truncate.WriteLine(str); // truncates and leaves the message with DateTime stamp
    }
}

另一方面,如果您想将截断日期的内容保存到文件中,则可以将以下方法与上述方法结合使用:

private void Truncate(readPath)     // to clear contents of file, copy, and note last time it was cleared and copied
{
    if (!File.Exists(readPath))    // create the new file for storing old entries
    {
        string readFile = readPath + ".txt";
        string writeFile = readPath + DateTime.Now.ToString("_dd-MM-yyyy_hh-mm") + ".txt"; // you can add all the way down to milliseconds if your system runs fast enough
        using (FileStream fs = new FileStream(writeFile, FileMode.OpenOrCreate, FileAccess.Write))
        {
            using (StreamWriter write = new StreamWriter(fs))
            using (StreamReader file = new StreamReader(readFile))
            {
                write.WriteLine(string.Format(textA, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")));
                string line;
                var sb = new StringBuilder();
                while ((line = file.ReadLine()) != null)
                {
                    line = line.Replace("\0", ""); // removes nonsense bits from stream
                    sb.AppendLine(line);
                }
                write.WriteLine(sb.ToString());
                string textB = "{0} : Copied Source";
                write.WriteLine(string.Format(textB, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")));
            }
        }
        string str = string.Format("{0} : Truncated Contents", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt"));
        using (StreamWriter truncate = new StreamWriter(readFile))
        {
            truncate.WriteLine(str); // truncates and leaves the message with DateTime stamp
        }
    }
}

无论哪种方式,您都可以通过以下块使用您选择的方法:

if(new FileInfo("audit.txt").Length >= 0xfffff) // hex for 1MB
{
    Truncate("audit");
}

我希望这对未来的读者有所帮助。

谢谢,


0
投票

也许这是一个简单的解决方案:

// Test the file is more or equal to a 1MB ((1 * 1024) * 1024)
// There are 1024B in 1KB, 1024KB in 1MB
if (new FileInfo(file).length >= ((1 * 1024) * 1024))
{
    // This will open your file. Once opened, it will write all data to 0
    using (FileStream fileStream = new FileStream(file, FileMode.Truncate, FileAccess.Write))
    {
        // Write to your file.
    }
}

0
投票

迟到的答案,但你可以尝试:

StreamWriter sw = new StreamWriter(YourFileName, false);
sw.Write("");
sw.Flush();
sw.Close();

发送

false
作为
StreamWriter()
的第二个参数告诉它不要追加,导致它覆盖文件。在这种情况下,使用空字符串,有效地截断它。

© www.soinside.com 2019 - 2024. All rights reserved.