2017-04-18 6 views
1

저는 Delphi 10.2 Tokyo Firemonkey를 사용하여 멀티 플랫폼 응용 프로그램을 작성하고 있습니다. Dropbox가 컴퓨터에 있는지 여부를 확인해야합니다. 이를 위해 info.json 파일의 존재 여부를 확인한 다음 해당 json 파일을 처리하여 Dropbox 폴더의 경로를 가져와야합니다.Delphi - OSX의 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; 

하지만 맥 (즉, 드롭 박스가 설치되어)에서이 작업을 실행할 때 FileExists 기능에 관계없이 두 번째 매개 변수의 false이 (되고 반환

나는 드롭 박스의 존재를 확인하기 위해이 기능을 썼다 True 또는 False). 터미널 창을 열고 cd ~/.dropbox을 실행 한 다음 dir을 실행하면 info.json 파일이 표시됩니다.

내가 누락 된 부분에 대한 의견이 있으십니까? 이것에 관한 어떤 조언도 감사 할 것입니다 ...

+0

정말이 매력적인 이중 부정 논리가 정말로 필요합니까? 'DropboxExists : = FileExists ('~/.dropbox/info.json', True) ' –

+0

이것은 내 앱의 실제 코드가 아닌 문제를 보여줄 수있는 독립 실행 형 코드입니다. 실제 코드에서 나는 파일을 찾고 json을 파싱하여 Dropbox 폴더의 실제 위치를 얻습니다. 그러나 나는 당신과 동의 할 것입니다, 그것은 당신이 제안한만큼 콤팩트했을 수 있습니다 :) – Rohit

+1

'FileExists()'체크를 제거하면 같은 경로를 사용하여 파일을로드 할 수 있습니까? 그렇다면'FileExists()'를 잊어 버리고 무조건 파일을 항상로드하고 필요에 따라로드 오류를 처리하십시오. –

답변

2

글쎄 - 나는 (시행 착오에 의해) 그것을 알아 낸 것입니다.

리터럴 ~/.dropbox을 사용할 때 Delphi는 해당 정확한 폴더를 찾고 있는데, 물론 존재하지 않습니다. OSX의 ~은 사용자의 디렉토리를 참조합니다 (예 : 내 경우 /Users/rohit). 따라서 ~/Users/rohit으로 바꾼 경우 응용 프로그램에서 파일을 찾았으며 예상대로 작동합니다.

은 그냥 대답의 완성도를 들어, 함수는 다음과 같이 쓸 수있다 : 여기에 키가 OSX에 현재 사용자의 디렉토리를 얻을 수 GetHomePath()를 사용하는 것입니다

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

참고; Windows에서는 현재 사용자의 %APPDATA% 폴더를 반환합니다.

+0

편집에 감사, @RemyLebeau :) – Rohit