Разработчики, столкнувшиеся с необходимостью работы с файловой системой в Android-приложениях, знают, как важно правильно обращаться с директориями и файлами. Одной из распространённых проблем является невидимость поддиректорий в основной директории приложения, что может привести к ошибкам в работе программы. В данной статье мы рассмотрим, как решить проблему получения списка поддиректорий в Android-приложении, созданном с использованием Delphi XE6.
Описание проблемы
Пользователи столкнулись с проблемой, когда в DocumentsPath их Android-приложения существовала поддиректория с именем 'default', но при попытке получить список директорий через DocumentsPath, эта поддиректория не отображалась. В коде использовалась функция TDirectory.GetDirectories, которая, как оказалось, не возвращала ожидаемые результаты.
Анализ кода
Приведём пример кода, который был использован для получения списка директорий:
procedure TdmoMain.SetupDirArray;
var
mDirs: TStringDynArray;
begin
RootDir := TPath.GetDocumentsPath;
{$if defined(MSWINDOWS)}
mDirs:=TDirectory.GetDirectories(RootDir, '[!_]*'); // на Windows не отображаются директории, начинающиеся с '_'
{$ELSE}
mDirs:=TDirectory.GetDirectories(RootDir);
{$ENDIF}
if High(mDirs) > 0 then // должно быть всегда True, но это не так
begin
SetHomeDir; // выполнение некоторых операций
end
else // к сожалению, код идёт сюда
begin
{ DEBUG CODE BEGIN }
SetLength(mDirs, 1);
mDirs[0]:=TPath.Combine(RootDir, 'default');
if TDirectory.Exists(mDirs[0]) then
ShowMessage('Puzzled!'); // это отображается!!!
{ DEBUG CODE END }
end;
end;
Подтверждённый ответ
Проблема заключалась в использовании функции High, которая возвращает индекс последнего элемента в массиве. Для массива с одним элементом High возвращает 0, что воспринимается как ложное условие. Вместо High(mDirs) > 0 следует использовать Length(mDirs) > 0, чтобы проверить наличие элементов в массиве.
Исправленный код
procedure TdmoMain.SetupDirArray;
var
mDirs: TStringDynArray;
begin
RootDir := TPath.GetDocumentsPath;
{$if defined(MSWINDOWS)}
mDirs:=TDirectory.GetDirectories(RootDir, '[!_]*');
{$ELSE}
mDirs:=TDirectory.GetDirectories(RootDir);
{$ENDIF}
if Length(mDirs) > 0 then // теперь условие будет корректно проверять наличие директорий
begin
SetHomeDir; // выполнение некоторых операций
end
else // если поддиректория 'default' существует, но не обнаружена функцией
begin
if TDirectory.Exists(TPath.Combine(RootDir, 'default')) then
ShowMessage('Поддиректория найдена!'); // отображение уведомления
end;
end;
Заключение
Важно правильно использовать функции для работы с файловой системой, особенно при разработке кроссплатформенных приложений. В данном случае, недопонимание работы функции High привело к ошибке в логике программы. Исправление кода позволило корректно обрабатывать наличие поддиректорий в Android-приложении на Delphi XE6.
Разработчики Android-приложения на Delphi XE6 столкнулись с проблемой, когда поддиректория в DocumentsPath не обнаруживалась из-за неправильного использования функции проверки наличия элементов в массиве.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS