2015-10-30 3 views
1

в определенном пути (. Например C:\foo\bar\), у меня есть неопределенное количество каталога с именем с целым числом, например .:Delphi: получить имя каталога максимального целого в определенном пути

C:\foo\bar\0\ 
C:\foo\bar\1\ 
C:\foo\bar\2\ 
C:\foo\bar\9\ 
C:\foo\bar\10\ 
C:\foo\bar\100\ 

я хотел бы получить целое каталог макс названный в C:\foo\bar\ пути, в этом случае составляет 100

Мой код работает, но медленно:

function GetMaxDir(const APath : String) : integer; 
var 
    LList : TStringDynArray; 
    I  : Integer; 
    EndFor : Integer; 
    CurrDir : string; 
    CurrVer : Integer; 
begin 
    Result := -1; 

    if not DirectoryExists(APath) then Exit; 

    LList := TDirectory.GetDirectories(APath); 
    EndFor := Length(LList) - 1; 
    CurrVer := 0; 

    for I := 0 to EndFor do begin 
     CurrVer := 0; 
     CurrDir := ExtractFileName(LList[I]); // return path leaf (the integer) 

     TryStrToInt(CurrDir, CurrVer); 

     if CurrVer > Result then Result := CurrVer; 
    end; 
end; 

использование, например .:

var 
    aMaxDir : integer; 
begin 
    aMaxDir := GetMaxDir('C:\foo\bar\'); // return 100 

Это быстрый способ?

+0

Можете ли вы изменить способ имен папок? Если вы можете изменить их для использования трех или четырех цифр (например, '001',' 002', '010',' 100'), вы можете просто отсортировать массив и затем захватить последний элемент. –

+1

Перечисление каталогов - это стоимость здесь. Сортировка массива, предложенная @KenWhite, будет еще медленнее. Это будет O (n log n), но ваш поиск - O (n). Игнорирование возвращаемого значения «TryStrToInt» невелико. Не делай этого. Почему вы верите, что можете сделать лучше, чем это? Какова ваша целевая аудитория? Как долго это займет? Где файлы? Локальная или сеть? Являются единственными каталогами этой формы, или есть много других, не входящих в эту форму? –

+0

@KenWhite no я не могу изменить имя каталогов – ar099968

ответ

0

Простой ответ НЕТ, поскольку, насколько я знаю, в Windows у вас нет API низкого уровня, который позволяет вам получить первый файл на основе заданных критериев сортировки.

+0

'TDirectory.GetDirectories' реализуется путем вызова' FindFirstFile', 'FindNextFile' и т. Д. Итак, как можно напрямую обратиться к этому вызову? –

+0

Это не поможет, это просто объяснение, что единственный API, который у нас есть на окнах, не позволяет этого. – aleroot

+0

Вы сказали, что быстрее получить результаты можно, вызвав тот же API, что и вызывается. Это звучит неправильно. Пожалуйста, исправьте этот второй абзац вашего ответа. –

Смежные вопросы