Search code examples
c#encodingtext-filesnewlinestreamreader

How can I know if a text file ends with carriage return or not?


I have to process a text file and check if it ends with a carriage return or not.

I have to read to whole content, make some changes and re-write it into the target file, keeping exactly the same formatting as original. And here is the problem: I don't know if the original file contains a line break or not at the end.

I've already tried:

  • the StreamReader.ReadLine() method, but the string that is returned does not contain the terminating carriage return and/or line feed.
  • also the ReadToEnd() method can be a solution, but I'm wondering about the performance in case of very big files. The solution has to be efficient.
  • getting the last 2 characters and check if them are equal to "\r\n" may resolve it, but I have to deal with lots of encodings, and it seems practically impossible to get them.

How can I efficiently read all the text of a file and determine whether it ended in a newline?


Solution

  • After reading the file through ReadLine(), you can seek back to two characters before the end of the file and compare those characters to CR-LF:

    string s;
    using (StreamReader sr = new StreamReader(@"C:\Users\User1\Desktop\a.txt", encoding: System.Text.Encoding.UTF8))
    {
        while (!sr.EndOfStream)
        {
            s = sr.ReadLine();
            //process the line we read...
        }
    
        //if (sr.BaseStream.Length >= 2) { //ensure file is not so small
    
        //back 2 bytes from end of file
        sr.BaseStream.Seek(-2, SeekOrigin.End);
    
        int s1 = sr.Read(); //read the char before last
        int s2 = sr.Read(); //read the last char 
        if (s2 == 10) //file is end with CR-LF or LF ... (CR=13, LF=10)
        {
            if (s1 == 13) { } //file is end with CR-LF (Windows EOL format)
            else { } //file is end with just LF, (UNIX/OSX format)
        }
    
    }