4

I want to read in a text file but I only know a part of the filename. To be more specific, the format of the file is "FOO_yyyymmdd_hhmmss.txt" but when running my program, I will only know "FOO_yyyymmdd_" and ".txt". In other words, I want to read that file based on just the date, ignoring the "hhmmss" (time) part for I will not know the time of that file, only the date.

Here is part of what I have so far:

ArrayList al = new ArrayList();

string FileName = "FOO_" + DateTime.Now.ToString("yyyymmdd") + "_" ;  //how do I correct this, keeping in mind that I need the time as well?

string InPath = @"\\myServer1\files\";
string OutPath = @"\\myServer2\files\";

string InFile = InPath + FileName;
string OutFile = OutPath + @"faceOut.txt";

using (StreamReader sr = new StreamReader(InFile))
{
    string line;

    while((line = sr.ReadLine()) != null)
    {
        al.Add(line);
    }
    sr.Close();                
}

How can I read this file without knowing the whole string beforehand?

huysentruitw
  • 27,376
  • 9
  • 90
  • 133
Divan
  • 309
  • 2
  • 3
  • 14

2 Answers2

4

How about using a wildcard * available with DirectoryInfo.EnumerateFiles

string FileName  = new DirectoryInfo(@"\\myServer1\files\")
             .EnumerateFiles(String.Format("FOO_{0:yyyymmdd}_*.txt", DateTime.Now))
             .FirstOrDefault()?.FullName; 

FileName == null means that the file was not found

Note that the Null-Conditional Operator (?.) can only be used from C# 6.0 onwards

Perfect28
  • 11,089
  • 3
  • 25
  • 45
3

Well, search for the files, then check that theres's only one file to read:

  var pathToSearch = @"\\myServer1\files\";
  var knownPart = string.Format("FOO_{0:yyyymmdd}_", DateTime.Now);

  var files = Directory
    .EnumerateFiles(pathToSearch, knownPart + "??????.txt")
    .Where(file => Regex.IsMatch(
      Path.GetFileNameWithoutExtension(file).Substring(knownPart.Length),
      "^(([0-1][0-9])|(2[0-3]))([0-5][0-9]){2}$"))
    .ToArray();

  if (files.Length <= 0) {
    // No such files are found
    // Probably, you want to throw an exception here
  }
  else if (files.Length > 1) {
    // Too many such files are found
    // Throw an exception or select the right file from "files"
  }
  else {
    // There's one file only
    var fileName = files[0];
    ...
  }
huysentruitw
  • 27,376
  • 9
  • 90
  • 133
Dmitry Bychenko
  • 180,369
  • 20
  • 160
  • 215