I have a method which reads all the files as a string from a directory and then iterate over those files to get file content along with other details and return a IEnumerable<DataFiles>
object from it as shown below:
public IEnumerable<DataFiles> GetFiles(string path)
{
var listOfFiles = new List<string>();
try
{
var jsonDataFiles = Directory.GetFiles(path, "*.json", SearchOption.AllDirectories);
var textDataFiles = Directory.GetFiles(path, "*.txt", SearchOption.AllDirectories);
listOfFiles.AddRange(jsonDataFiles);
listOfFiles.AddRange(textDataFiles);
for (int i = 0; i < listOfFiles.Count; i++)
{
var cfgPath = listOfFiles[i];
if (!File.Exists(cfgPath)) { continue; }
var fileContent = File.ReadAllText(cfgPath);
var pieces = cfgPath.Split(System.IO.Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries);
var fileName = pieces[pieces.Length - 1];
var md5HashValue = GetMD5Hash(cfgPath);
// error on below line
yield return new DataFiles
{
FileName = fileName,
FileContent = fileContent,
MD5Hash = md5HashValue
};
}
}
catch (UnauthorizedAccessException ex)
{
// log error here
}
// error on below line
return null;
}
But somehow I get a compilation error at yield return new
line and also return null
line in my above method. Below are the errors I am seeing:
Cannot yield a value in the body of a try block with a catch clause
Cannot return a value from an iterator. Use the yield return statement to return a value, or yield break to end the iteration.
If above code throws exception then I want to return empty IEnumerable<DataFiles>
object otherwise it should return proper IEnumerable<DataFiles>
object` with data in it.
What is wrong I am doing here? Is there any better and clean way to write above method so that I don't have to return null at the end of the method?