Возвращаемое имя файла с наибольшим значением - PullRequest
0 голосов
/ 02 апреля 2020

Я пишу приложение. NET Framework (C#). У меня есть каталог, который содержит файлы и папки. Каждая папка имеет номер 3 di git в качестве имени. Я хочу найти имя папки с наибольшим значением.

До сих пор я придумал следующий код:

public void doCopyFiles()
{
    string sourceDir = @"C:\Users\xyz\abc\gth";
    var sorted = Directory.GetFiles(sourceDir, ".").OrderBy(path => int.Parse(Path.GetFileNameWithoutExtension(path)));
    var lastFile = sorted.Last();
    Console.WriteLine(lastFile);
}

Однако это вызывает исключение System.FormatException, которое говорит msgstr "строка ввода не в ожидаемом формате". Я предполагаю, что это потому, что есть другие файлы, которые имеют нормальные строки в качестве имени файла.

Есть ли какие-либо предложения о том, как это исправить?

РЕДАКТИРОВАТЬ: После попытки обоих решений, показанных ниже, та же ошибка все еще сохраняется.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Отредактировано, чтобы отразить ответы на комментарии и вопросы.

  public void doCopyFiles()
  {
      int highestFolder = int.MinValue;

      string sourceDir = @"C:\Users\xyz\abc\gth";

      var dirs = Directory.GetDirectories(sourceDir);
      foreach(var value in dirs)
      {

           if(int.TryParse(value, out int result))
           {
                if(result > highestFolder)
                {
                     highestFolder = result;
                }
           }

      }

      if(highestFolder != int.MinValue)
      {
           Console.WriteLine(highestFolder);
      }
      else //no folder with int names were found
      {
           //error message
      }
   }
0 голосов
/ 02 апреля 2020

Исправление для вашей реализации - сначала выбрать имена файлов, которые являются цифрами. Это можно сделать, проверив совпадение с регулярным выражением \d+

var sorted = Directory.GetFiles(sourceDir, ".")
    .Where(  path => Regex.IsMatch(Path.GetFileNameWithoutExtension(path), @"\d+"))
    .OrderBy(path => int.Parse(Path.GetFileNameWithoutExtension(path)));

Предполагая, что имена ваших чисел c дополняются нулями (001 вместо 1), вы можете сортировать без анализа значения. На основе числовых значений c символов ASCII ваши пронумерованные файлы должны быть перечислены по порядку и первыми в отсортированном списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...