2013-09-17 6 views
7

Как сохранить файл локально на устройстве Android, с помощью Delphi (XE5, Firemonkey)?Как сохранить файл на Android? (Firemonkey)

Что-то же просто, как

Memo.Lines.SaveToFile('test.txt') 

не похоже на работу. В результате появляется следующее сообщение об ошибке:

«Невозможно создать файл /test.txt». Не каталог ».

+0

Когда вы говорите локально, что вы имеете в виду? SDCard (внутренние/внешние?), Частные данные? Другие? Вы не можете создать файл в '/' без root и разрешений. – Simon

+0

Я надеялся, что могу просто написать в «текущем каталоге» внутреннего хранилища (где бы это ни было). Обратите внимание, что я не указал обратную косую черту перед именем файла. Я удивлен, что кажется, что он пытается написать в корне. – Reinier

+0

Я также пробовал этот путь: «/Android/data/com.embarcadero.TestLocalStorage/files/» (http://developer.android.com/guide/topics/data/data-storage.html, кажется, указывает, что это может быть надлежащим местом для внутреннего хранилища). Но получил тот же результат – Reinier

ответ

14

Согласно документу Creating an Android App, получить путь документов, как это:

System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile'; 
+0

Вот что я искал. Спасибо большое! BTW: в данном случае: никаких конкретных разрешений не требуется. – Reinier

+9

Не хотите использовать Path.Combine или что бы то ни было, что функция –

0

GetHomePath, возвращает строку с путем. -> 'данные/данные // файлы'

Вы можете использовать:

Memo.Lines.SaveToFile(format('%s/test.txt', [GetHomePath])); 

Или эта форма

Memo.Lines.SaveToFile(GetHomePath + '/test.txt'); 
7

Вместо использования System.SysUtils.PathDelim, вы можете использовать

System.IOUtils.TPath.Combine(System.IOUtils.tpath.getdocumentspath,'test.txt'); 

Combine выбирает между окнами \ и t он должен использовать в этой строке вместо установки в предложении uses, потому что есть, вероятно, больше инициалов Tpath.

1

на моем устройстве (и предположительно все устройства Android?) GetHomePath неправильно дает мне/storage/emulated/0/... тогда как мне нужно/storage/sdcard0/..., чтобы добраться до хранилища, видимого в проводнике Windows, через USB.

поэтому полный путь к моим файлам может быть «/storage/sdcard0/Android/data/com.embarcadero.(my название приложения)/файлы /»

Предположительно, если у вас есть плагин в SD-карте это может быть sdcard1 или что-то еще.

Вы можете просмотреть содержимое вашей папки для хранения устройства с кодом, как этот

P := '/storage/'; 
    if (FindFirst(P + '*', faAnyFile, Sr) = 0) then 
    repeat 
    Memo1.Lines.Add(Sr.Name); 
    until (FindNext(Sr) <> 0); 
    FindClose(Sr); 

На моем устройстве это дает мне:

sdcard0 USB эмулировать

затем изменить S, когда вы хотите изучить подпапки

Обратите внимание, что папка с файлами очищается каждый раз, когда вы recom свай и развертывание.

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