gpt4 book ai didi

delphi - Delphi中如何创建文件夹和txt文件

转载 作者:行者123 更新时间:2023-12-01 22:37:44 24 4
gpt4 key购买 nike

如何在Android的内部存储(?)中创建一个新文件夹(我想说的是,包含所有子文件夹的主文件夹...... Whatsapp,DCIM,图片,铃声, Alarms ..) 并在此文件夹中创建一个新的 .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);

但我不明白它是如何工作的,所以我什至无法使用它。

我还发现了this link ,但我没有找到任何函数返回我想要创建文件夹的“常规”目录路径。

函数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代码和this code我设法做到了这一点。问题是用文件更新目录的代码没有执行任何操作

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 Warning] u_corrida.pas(682): W1000 Symbol 'SharedActivityContext' is deprecated: 'Use TAndroidHelper.Context'

所以我改变了代码

注意:我也尝试用“System.IOUtils.TPath.GetSharedDownloadsPath”替换“path_file”,但也无济于事

此问题已得到解答,另一个问题(索引文件和文件夹)已移至:How to index a created file in Android sdcard Delphi

最佳答案

您实际上并不需要“内部存储”,它是您的应用程序的私有(private)存储,甚至用户也无法访问它(无需设备的根访问权限)。您需要“外部存储”,以便用户(和其他应用程序)可以访问它。

Save files on device storage在 Android 的文档中:

Internal storage is best when you want to be sure that neither the user nor other apps can access your files.

External storage is the best place for files that don't require access restrictions and for files that you want to share with other apps or allow the user to access with a computer.

使用 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;

关于delphi - Delphi中如何创建文件夹和txt文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192691/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com