Reinier
Reinier

Reputation: 519

How to save a file on Android? (Firemonkey)

How can I save a file locally on an Android device, using Delphi (XE5, Firemonkey)?

Something as simple as

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

does not seem to work. It results in the following error message:

"Cannot create file "/test.txt". Not a directory."

Upvotes: 14

Views: 44181

Answers (4)

user3015173
user3015173

Reputation: 111

Instead of using System.SysUtils.PathDelim, you may use

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

Combine chooses between the windows \ and the Linux /

System.IOUtils must be used in this line instead of setup in the uses clause because there are probably more Tpath initials.

Upvotes: 11

Leslie Kaye
Leslie Kaye

Reputation: 91

on my device (and presumably all android devices?) GetHomePath incorrectly gives me /storage/emulated/0/... whereas I need /storage/sdcard0/... to get to the storage visible in Windows Explorer via USB.

so the full path to my files may be '/storage/sdcard0/Android/data/com.embarcadero.(my app name)/files/'

Presumably if you have a plug in SD card this might be sdcard1 or whatever.

You can list the contents of your device storage folder with code like this

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

On my device this gives me:

sdcard0 usb emulated

then change S when you want to explore subfolders

Note that the files folder gets emptied each time you recompile and deploy.

Upvotes: 3

Juan
Juan

Reputation: 21

GetHomePath, return a string with the path. -> 'data/data//files'

You can to use:

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

Or this form

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

Upvotes: 2

Marcus Adams
Marcus Adams

Reputation: 53830

According to the document Creating an Android App, get the documents path like this:

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

Upvotes: 18

Related Questions