how to get the newest created file in a directory using only GetFiles in System.IO Namespace in C#

StackOverflow https://stackoverflow.com/questions/17175689

Вопрос

I would like to create a method which returns me the newest created file in a Directory in C# with the preferred usage of the Directory.GetFiles() method in the System.IO Namespace. Maybe it's possible to do it also without LINQ to keep it compatible with NET 2.0. Good would be also if the FilePath could be returned as a string not as a File Object if possible The construct should look like below, but how I can see the newest file only?

public static string NewestFileofDirectory(string DirectoryName)
{
 foreach(string File in Directory.GetFiles(DirectoryName))
 {
  if(new FileInfo(File).CreationDate > ???) //here I stuck
  {
    //interesting what would be here...
  }
 }
}
Это было полезно?

Решение 2

You can do this using the FileInfo and DirectoryInfo classes. You will first get all the files in the specified directory and then compare their LastWriteTime to others and thus by comparison you can get the most recently writte or recent file. Here is code for this method.

 /// <summary>
 /// Returns recently written File from the specified directory.
 /// If the directory does not exist or doesn't contain any file, null is returned.
 /// </summary>
 /// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
 /// <returns></returns>
 public static string NewestFileofDirectory(string directoryPath )
 {
    DirectoryInfo directoryInfo  = new DirectoryInfo(directoryPath);
    if (directoryInfo == null || !directoryInfo.Exists)
        return null;

     FileInfo[] files = directoryInfo.GetFiles();
     DateTime recentWrite = DateTime.MinValue;
     FileInfo recentFile = null;

     foreach (FileInfo file in files)
     {
         if (file.LastWriteTime > recentWrite)
         {
            recentWrite = file.LastWriteTime;
            recentFile = file;
         }
      }
         return recentFile.Name;
 }

Другие советы

Boilerplate search coming right up. Thank god for LINQ :)

var minTime = DateTime.MinValue;

string theFile = null;

foreach (var entry in Directory.GetFiles(dirName))
{
    if (File.GetCreationTimeUtc(entry) > minTime)
    {
        minTime = File.GetCreationTimeUtc(entry);
        theFile = entry;
    }
}

Both of the above answers have issues with empty directories. Here is a hybrid answer that checks for empty dir and non existent dir.

    /// <summary>
    /// Returns most recently written Filename from the specified directory.
    /// If the directory does not exist or doesn't contain any file, null is returned.
    /// </summary>
    /// <param name="directoryInfo">Path of the directory that needs to be scanned</param>
    /// <param name="filePattern">Search Pattern for file</param>
    /// <returns></returns>
    public static string NewestFileInDirectory(string directoryPath, string filePattern)
    {
        DirectoryInfo directoryInfo = new DirectoryInfo(directoryPath);
        if (directoryInfo == null || !directoryInfo.Exists)
        {
            return null;
        }

        var minTime = DateTime.MinValue;

        string newestFile = null;

        foreach (var file in Directory.GetFiles(directoryPath, filePattern))
        {
            var fileLastWriteTime = File.GetLastWriteTimeUtc(file);
            if (fileLastWriteTime > minTime)
            {
                minTime = fileLastWriteTime;
                newestFile = file;
            }
        }
        return newestFile;
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top