C# 通过';截断txt文件;x';字节#

C# 通过';截断txt文件;x';字节#,c#,byte,line,filestream,truncate,C#,Byte,Line,Filestream,Truncate,我想在阅读内容后去掉文本文件的最后一行。文本文件相当大,因此由于性能问题,无法进行读/写操作 我目前的想法是计算最后一行表示的字节数(以及进位返回)并截断文件 我看到的许多选项都提到了使用“Filestream.setLength()”,我对它的工作原理感到困惑 这难道不只是写回文件,而是在某个字节数处停止文件,因为“read”函数读取字节,然后将它们写回缓冲区?或者我可以在阅读时使用这个函数,并将文本文件的“结束位置”移回,比如说24字节 这是我正在使用的当前代码 try

我想在阅读内容后去掉文本文件的最后一行。文本文件相当大,因此由于性能问题,无法进行读/写操作

我目前的想法是计算最后一行表示的字节数(以及进位返回)并截断文件

我看到的许多选项都提到了使用“Filestream.setLength()”,我对它的工作原理感到困惑

这难道不只是写回文件,而是在某个字节数处停止文件,因为“read”函数读取字节,然后将它们写回缓冲区?或者我可以在阅读时使用这个函数,并将文本文件的“结束位置”移回,比如说24字节

这是我正在使用的当前代码

try
            { 
            //reading
            using (StreamReader reader = new StreamReader(filePath))
            {
                    while (!reader.EndOfStream)
                    {
                        //gets the line
                        line = reader.ReadLine();
                        if (!line.StartsWith("KeyWord", StringComparison.InvariantCultureIgnoreCase))
                        {
                            //add number of lines
                            lineCount += 1;
                        }
                        else
                        {
                            //Finds the occurence of the first numbers in a string
                            string resultString = Regex.Match(line, @"\d+").Value;
                            long lastLineBytes = 0;
                            foreach (char c in line)
                            {
                                //each char takes up 1 byte
                                lastLineBytes++;         
                            }
                            //carriage return
                            lastLineBytes += 2;
                            long fileLength = new FileInfo(filePath).Length;
                            Trace.WriteLine("The length of the file is " + fileLength);

                            //the size of the file - the last line
                            //truncate at this byte position, and we will be done. 
                            long newFileLength = fileLength - lastLineBytes;
                            //Truncation goes ehre
                        }
                }
          }
        }
        catch (Exception e)
        {
            throw e;
        }

如果更改流的大小,它将只重写文件表索引,以仅指向左侧字节

对于第二个问题,是的,您可以使用它来读取内容(在本例中,我假设使用ASCII编码,使用适当的编码器)


我通读了这篇文章,但仍然无法理解如何在实践中使用它。你有没有这样的例子我可以查一下?我不能保证,但我相信改变流的大小只会改变文件表索引,使其只指向左边的字节,创建一个非常简单的测试程序并测试它,这是你最好的机会。是的,将其作为字节数组读取,然后使用System.Text.Encoding。(文件编码).GetString(theReadBytes);这取决于你想要实现什么,你能解释一下你的目标是什么吗?根据你想要做什么,有不同的选择,而且,如果你的文件是用UTF8编码的,它具有可变的字符大小,使用任意长度的数组将破坏内容。ASCII不是一个很好的假设,因为它在这个上下文中并不常见与问题中代码使用的UTF--8直接相反。请参阅。@TomBlodget,如果文件是由.net创建的。此外,任何假设都是错误的,因为我声明要将其更改为正确的编码器,ASCII是文本文件的历史标准,是的,现在最常见的是UTF8,但古代习俗很难做到这一点o更改,我已经编程30年了,所以我的文本文件仍然是ASCII XD。
FileStream str = //get the stream
byte[] data = new byte[str.Length];
str.Read(data, 0, data.Length);
string theContent = System.Text.Encoding.ASCII.GetString(data);