Delphi — проверка Dropbox на OSX

Я пишу мультиплатформенное приложение, используя Delphi 10.2 Tokyo Firemonkey. Одна из вещей, которые мне нужно проверить, это наличие Dropbox на компьютере. Для этого мне нужно проверить наличие файла info.json, а затем обработать этот файл json, чтобы получить путь к папке Dropbox.

Я написал эту функцию для проверки наличия Dropbox:

class function TUtilityMac.DropboxExists: Boolean;
var
  infojsonpath: String;
begin
  Result:=false;
  infojsonpath:='~/.dropbox/info.json';
  if not FileExists (infojsonpath, True) then
    exit;
  Result:=true;
end;

Но когда я запускаю это на Mac (с установленным Dropbox), функция FileExists возвращает false (независимо от того, является ли второй параметр True или False). Если я открою окно терминала и сделаю cd ~/.dropbox, а затем dir, я увижу там файл info.json.

Любые мысли о том, что мне не хватает? Был бы признателен за любые указания по этому поводу...


person Rohit    schedule 18.04.2017    source источник
comment
Вы уверены, что вам действительно нужна эта извилистая логика двойного отрицания? DropboxExists := FileExists('~/.dropbox/info.json', True)   -  person Free Consulting    schedule 18.04.2017
comment
Это всего лишь отдельный фрагмент кода, показывающий проблему, а не фактический код в моем приложении. В моем фактическом коде я нахожу файл и анализирую json, чтобы получить фактическое местоположение папки Dropbox. Но я согласен с вами, он мог бы быть настолько компактным, как вы предлагаете :)   -  person Rohit    schedule 18.04.2017
comment
Если вы уберете проверку FileExists(), сможете ли вы загрузить файл по тому же пути? Если да, то просто забудьте FileExists() и всегда безоговорочно загружайте файл и обрабатывайте любые ошибки загрузки по мере необходимости.   -  person Remy Lebeau    schedule 18.04.2017
comment
Спасибо @RemyLebeau - попробую и дам вам знать, как это работает...   -  person Rohit    schedule 19.04.2017
comment
@RemyLebeau - я получил EFileNotFoundException, когда попытался загрузить файл. Но файл существует. Есть идеи, что может происходить?   -  person Rohit    schedule 19.04.2017
comment
Разобрался - отвечу ответом на вопрос...   -  person Rohit    schedule 19.04.2017


Ответы (1)


Ну - разобрался (методом проб и ошибок).

Проблема в том, что когда мы используем литерал ~/.dropbox, Delphi ищет именно эту папку, которой, конечно же, не существует. ~ в OSX относится к каталогу пользователя (например, в моем случае это будет /Users/rohit). Итак, если я заменил ~ на /Users/rohit, приложение нашло файл, и все заработало, как ожидалось.

Просто для полноты ответа функцию можно записать так:

class function TUtilityMac.DropboxExists: Boolean;
var
  infojsonpath: String;
begin
  infojsonpath := IncludeTrailingPathDelimiter(GetHomePath) + '.dropbox/info.json';
  Result := FileExists(infojsonpath, True);
end;

Обратите внимание, что ключевым моментом здесь является использование GetHomePath() для получения каталога текущего пользователя в OSX; в Windows возвращает папку %APPDATA% текущего пользователя.

person Rohit    schedule 19.04.2017