如何在Android的内部存储(?)中创建一个新文件夹(我想说,主文件夹包含所有子文件夹... Whatsapp,DCIM,图片,铃声,闹钟..),并在其中创建一个新.txt
文件在此文件夹中。
我要创建一个.txt
文件,我需要用户将USB电缆插入他们的计算机,访问该设备,输入我的应用程序创建的文件夹,然后将此文件复制到他们的桌面。
我尝试使用以下代码创建文件:
procedure TF_start.Button2Click(Sender: TObject); var output_text: string; arquivo: TextFile; begin output_text := 'test'; TFile.WriteAllText(TPath.Combine(TPath.GetDocumentsPath, 'test.txt'), 'content'); ReWrite(arquivo); WriteLn(arquivo, output_text); CloseFile(arquivo); end;
但这行不通。
要获取内部存储(?)路径,我找到了以下代码:
P := '/storage/'; if (FindFirst(P + '*', faAnyFile, Sr) = 0) then repeat Memo1.Lines.Add(Sr.Name); until (FindNext(Sr) <> 0); FindClose(Sr);
但是我不明白它是如何工作的,所以我什至不能使用它。
我也找到了此链接,但是没有找到任何函数返回我要创建文件夹的“常规”目录路径。
函数System.IOUtils.TPath.GetHomePath()
,并System.IOUtils.TPath.GetDocumentsPath()
没有返回正确的路径。
System.SysUtils.GetHomePath()
返回-> /data/user/0/com.embarcadero.app/cache
System.IOUtils.TPath.GetDocumentsPath()
返回-> /data/com.embarcadero.app-1/lib/arm
@编辑
使用@Remy Lebeau代码和这段代码,我设法做到了这一点。问题是用文件更新目录的代码什么都不做
Use System.IOUtils, Androidapi.Helpers, Androidapi.Jni.Media, Androidapi.JNI.JavaTypes, Androidapi.JNI.GraphicsContentViewText;
//按钮
procedure TF_start.Button2Click(Sender: TObject); var path_file output_text: string; begin path_file := TPath.Combine(System.IOUtils.TPath.GetSharedDownloadsPath, 'Folder_app'); output_text := 'test'; if not TDirectory.Exists(path_file) then TDirectory.CreateDirectory(path_file); try TFile.WriteAllText(TPath.Combine(path_file, Nome_Arquivo), Arquivo_saida); except ShowMessage('An error occurred while saving the file.'); end; end;
另一个按钮:
procedure TF_corrida.BTNfinalize_appClick(Sender: TObject); var c: Integer; JMediaScannerCon: Androidapi.Jni.Media.JMediaScannerConnection; JMediaScannerCon_Client: Androidapi.Jni.Media.JMediaScannerConnection_MediaScannerConnectionClient; begin JMediaScannerCon:=TJMediaScannerConnection.JavaClass.init(TAndroidHelper.Context, JMediaScannerCon_Client); JMediaScannerCon.connect; c:=0; while not JMediaScannerCon.isConnected do begin Sleep(100); inc(c); if (c>20) then break; end; if (JMediaScannerCon.isConnected) then begin JMediaScannerCon.scanFile(StringToJString(path_file), nil); JMediaScannerCon.disconnect; end; end;
PS此警告出现:
[DCC警告] u_corrida.pas(682):不推荐使用W1000符号'SharedActivityContext':'Use TAndroidHelper.Context'
所以我改变了代码
注意:我也尝试用“ System.IOUtils.TPath.GetSharedDownloadsPath”替换“ path_file”,但也无济于事
该问题已得到解答,其他问题(索引文件和文件夹)已移至:如何在Android sdcard Delphi中索引已创建的文件
您实际上并不需要“内部存储”,它对您的应用是私有的,甚至用户也无法访问它(没有对设备的root访问权限)。您需要使用“外部存储”,以便用户(和其他应用程序)可以访问它。
每保存文件在设备上存储 Android的文档:
当您要确保用户和其他应用程序都无法访问您的文件时,内部存储是最佳选择。
对于不需要访问限制的文件以及您要与其他应用程序共享或允许用户用计算机访问的文件来说,外部存储是最好的地方。
使用其中一种TPath.GetShared...()
方法来获取“外部存储”路径,例如TPath.GetSharedDocumentsPath()
。并确保您的应用已WRITE_EXTERNAL_STORAGE
启用权限。
另外,请注意,TFile.WriteAllText()
这不会创建丢失的文件夹(实际上,它将引发EDirectoryNotFoundException
)。您必须首先自己创建文件夹,例如使用TDirectory.CreateDirectory()
或SysUtils.ForceDirectories()
。TPath.Combine()
只需将输入字符串连接在一起,就不会创建实际的文件夹。
尝试这个:
procedure TF_start.Button2Click(Sender: TObject);
var
path, output_text: string;
begin
output_text := 'test';
path := TPath.Combine(TPath.GetSharedDocumentsPath, 'myfolder');
if not TDirectory.Exists(path) then
TDirectory.CreateDirectory(path);
TFile.WriteAllText(TPath.Combine(path, 'test.txt'), output_text);
end;