14

如何使用 Delphi(XE5、Firemonkey)在 Android 设备上本地保存文件?

像这样简单的东西

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

似乎不起作用。它会导致以下错误消息:

“无法创建文件“/test.txt”。不是目录。”

4

4 回答 4

19

根据文档Creating an Android App,获取文档路径如下:

System.IOUtils.TPath.GetDocumentsPath + System.SysUtils.PathDelim + 'myfile';
于 2013-09-17T19:30:11.423 回答
11

而不是使用System.SysUtils.PathDelim,您可以使用

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

Combine在 windows\和 Linux之间进行选择/

System.IOUtils必须在这一行中使用,而不是在uses 子句中使用setup,因为可能有更多的Tpath 首字母。

于 2013-11-23T12:25:40.213 回答
2

在我的设备上(可能是所有 android 设备?)GetHomePath 错误地给了我 /storage/emulated/0/... 而我需要 /storage/sdcard0/... 才能通过 USB 访问 Windows 资源管理器中可见的存储。

所以我的文件的完整路径可能是 '/storage/sdcard0/Android/data/com.embarcadero.(my app name)/files/'

据推测,如果你有一个插入 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

请注意,每次重新编译和部署时,文件文件夹都会被清空。

于 2014-02-08T12:36:30.053 回答
2

GetHomePath,返回一个带路径的字符串。-> '数据/数据//文件'

您可以使用:

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

或者这个表格

Memo.Lines.SaveToFile(GetHomePath + '/test.txt');
于 2013-11-18T20:14:49.647 回答