File helpers using LINQ
When dealing with files, it is useful to have standard set of helpers to be used that we can relay on. This is when LINQ comes in handy. In this article I will present you with some useful functions that you can use in your daily programming.
Simple operation should be simple. Hence, when getting the number of lines in the text file, one line of code is just enough.
public static long GetNumberOfLines(string filePath) { return File.Exists(filePath) ? File.ReadAllLines(filePath).Count() : 0; }
Getting the biggest file in the folder is also very easy with LINQ
public static string FindTheLargestFileInDirectory(string path) { return Directory.Exists(path) && Directory.GetFiles(path).Count() > 0 ? Directory.EnumerateFiles(path).Select(i => new FileInfo(i)) .OrderByDescending(i => i.Length).FirstOrDefault().FullName : null; }
Similar when getting all files with the size of less than 1 Kb
public static IEnumerable<string> FindFilesLessThanOneKiloBytesInThisFolder(string path) { return Directory.Exists(path) && Directory.GetFiles(path).Count() > 0 ? Directory.EnumerateFiles(path).Select(i => new FileInfo(i)) .Where(i => i.Length < 1024).Select(i => i.FullName) : null; }
You can use this function if you need to get files created in last 7 days
public static IEnumerable<string> FindAllFilesCreatedLessThanWeekAgo(string path) { return Directory.Exists(path) && Directory.GetFiles(path).Count() > 0 ? Directory.EnumerateFiles(path).Select(i => new FileInfo(i)) .Where(i => i.CreationTime > DateTime.Now.AddDays(-7)) .Select(i => i.FullName) : null; }
And finally if you want to get the oldest file in the folder (common scenario when deleting old logs) you can try this
public static string FindOldestFileInFolder(string path) { return Directory.Exists(path) && Directory.GetFiles(path).Count() > 0 ? Directory.EnumerateFiles(path) .Select(i => new FileInfo(i)) .OrderByDescending(i => i.LastAccessTime).FirstOrDefault() .FullName : null; }
If you want to compare two files and get identical lines this may be useful to you
public static IEnumerable<string> FindIdenticalLinesInTwoFiles(string filePath1, string filePath2) { if (File.Exists(filePath1) && File.Exists(filePath2)) { return File.ReadAllLines(filePath1).Where(i => !string.IsNullOrEmpty(i)) .Intersect(File.ReadAllLines(filePath2).Where(i => !string.IsNullOrEmpty(i))); } return null; }
When collecting system information this function may be useful as well. It simply gets all extensions of the files in the directory and counts number of files associated with them.
public static Dictionary<string, int> ListAndCountTheNumberOfDifferentFileExtensions(string path) { return Directory.EnumerateFiles(path) .Select(i => new FileInfo(i)) .GroupBy(i => i.Extension) .OrderByDescending(i => i.Count()) .ToDictionary(i => i.Key, i => i.Count()); }
As you can see using LINQ is so easy that allows you to focus more on the business problems and less on coding itself.