모바일 앱에서 '사용자 배포 파일'에 접근하기

C++ Builder로 모바일 앱(App)을 만들 때, 누구나 자신만의 그림이나 노래와 같은 '사용자 배포 파일'들을 앱에 따로 추가하고 싶을 것 입니다. 이렇게 따로 사용자만의 파일을 배포하기 위해서는 반드시 모바일 기기의 샌드박스(SandBox) 영역에 배포해야 합니다. 


샌드박스의 위치는 Android는 ".\assets\internal" 라는 폴더이고, iOS는 "StartUp\Documents" 라는 폴더입니다. 폴더 경로의 경우 대소문자도 구별하기 때문에 C++ Builder IDE 메뉴의 Project>Deployment 설정에서 입력할 때 상당히 신경써줘야 합니다. Deployment 설정과 관련한 부분은 나중에 따로 정리할 수 있도록 하겠습니다. (Deployment 설정 추가)


문제는 이렇게 배포한 파일에 접근하기 위해서는 프로그램 내에서 파일이 존재하는 경로를 찾아와야 하는데, C++ Builder에서는 이 방법이 꽤나 난해합니다. 일단 폴더 경로를 구하기 위해서는 GetDocumentsPath()라는 함수를 호출해야 하는데, 이 함수는 System.Ioutils 헤더 파일의 TPath라는 레코드(record)에 존재합니다. 


따라서, 이 함수를 호출하기 위해서는 먼저 System.IOUtils.hpp라는 이름의 헤더 파일을 include하고, 아래와 같이 상당히 긴 문장의 함수명을 입력해야 합니다. 그나마 다행인 것은 헤더 파일을 include하면 코드 인사이트(Code Insight)가 알아서 함수를 찾아주기 때문에 입력 오류는 줄일 수 있습니다. (그래도 길이가 길어서 한눈에 잘 안들어오는 감이 있습니다. ㅜㅜ)


 #include <System.IOUtils.hpp>


 ----


 String fileName = System::Ioutils::TPath::Combine(System::Ioutils::TPath::GetDcumentsPath(), L"filename");


namespace를 지정하면 그냥 함수만 호출할 수 있을 것 같아서 시도해 봤으나, 그냥 위의 방식으로 하는게 제일 속편합니다. (참고 자료를 보면 Delphi는 좀 더 편하게 호출할 수 있는데, C++ Builder는 왜 그런 식으로 안되는 것일까요?)  


또, 위 문장을 보면 GetDocumentsPath와 함께 Combine 함수도 사용하는데 파일 경로를 구하는 방식이 단순히 String을 더하는 것으로는 동작하지 않기 때문입니다. 실제 모바일 앱을 실행할 때 파일 주소를 확인해보면 약간 암호처럼 숫자로 된 폴더 경로가 나오는데 (추후 경로 결과 추가), 이처럼 단순히 텍스트가 합해지는 형태는 아니기 때문에 String 객체의 operator+ 함수를 사용할 수가 없으므로 Combine이라는 함수를 사용해서 경로와 파일 이름을 취합하게 됩니다. 아무래도, 이 부분은 모바일의 샌드박스 정책과 관련한 부분이라 Embarcadero에서도 어쩔 수 없는 것 같습니다. 


어쨌든 Embarcadero의 공식 문서에서도 계속해서 위와 같은 방법을 사용하고 있는 것으로 보아 당분간은 모바일에서 사용자 배포 파일에 접근하는 방법에는 위 방법보다 더 편한 방법은 없을 듯 합니다. 


참고 자료 : docwiki.embarcadero.com/RADStudio/XE6/en/Creating_an_Android_App 문서 중 Loading and Deploying Files 부분


'FireMonkey' 카테고리의 다른 글

모바일 앱에서 '사용자 배포 파일'에 접근하기  (0) 2014.07.29