Read in the entire file and count the number of linefeeds, as shown in the following method:
using System; using System.Text.RegularExpressions; using System.IO; public static long LineCount(string source, bool isFileName) { if (source != null) { string text = source; if (isFileName) { FileStream FS = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader SR = new StreamReader(FS); text = SR.ReadToEnd( ); SR.Close( ); FS.Close( ); } Regex RE = new Regex(" ", RegexOptions.Multiline); MatchCollection theMatches = RE.Matches(text); // Needed for files with zero length // Note that a string will always have a line terminator // and thus will always have a length of 1 or more if (isFileName) { return (theMatches.Count); } else { return (theMatches.Count) + 1; } } else { // Handle a null source here return (0); } }
An
alternative version of this method uses the
StreamReader.ReadLine
method to count lines in a
file and a regular expression to count lines in a
string:
public static long LineCount2(string source, bool isFileName) { if (source != null) { string text = source; long numOfLines = 0; if (isFileName) { FileStream FS = new FileStream(source, FileMode.Open, FileAccess.Read, FileShare.Read); StreamReader SR = new StreamReader(FS); while (text != null) { text = SR.ReadLine( ); if (text != null) { ++numOfLines; } } SR.Close( ); FS.Close( ); return (numOfLines); } else { Regex RE = new Regex(" ", RegexOptions.Multiline); MatchCollection theMatches = RE.Matches(text); return (theMatches.Count + 1); } } else { // Handle a null source here return (0); } }
The following method counts the lines within a specified text file and a specified string:
public static void TestLineCount( ) { // Count the lines within the file TestFile.txt LineCount(@"C:TestFile.txt", true); // Count the lines within a string // Notice that a characters start a new line // as well as just the character LineCount("Line1 Line2 Line3 Line4", false); }
Every line ends with a special character. For Windows files, the line
terminating characters are a carriage return followed by a linefeed.
This sequence of characters is described by the regular expression
pattern
. Unix files terminate their lines
with just the
linefeed character
(
). The regular expression
"
" is the lowest common denominator for both
sets of line-terminating characters. Consequently, this method runs a
regular expression that looks for the pattern "
"
in a string or file.
Macintosh files usually end with a
carriage-return character (
). To count the
number of lines in this type of file, the regular expression should
be changed to the following in the constructor of the
Regex
object:
Regex RE = new Regex(" ", RegexOptions.Multiline);
Simply running this regular expression against a string returns the number of lines minus one because the last line does not have a line-terminating character. To account for this, one is added to the final count of linefeeds in the string.
The LineCount
method accepts two parameters. The
first is a string
that either contains the actual
text that will have its lines counted or the path and name of a text
file whose lines are to be counted. The second parameter,
isFileName
, determines whether the first parameter
(source
) is a string or a file path. If this
parameter is true
, the source parameter is a file
path; otherwise, it is simply a string.