在从Delphi 10.4迁移到Delphi 11时,您可能会发现TDirectory.GetFiles()
函数在尝试列出Android设备共享存储中的文件时返回空列表。尽管已正确设置了必要的权限,并且TDirectory.GetDirectories()
和TFile.Exists()
能正常工作,但读取文件内容如使用TFile.ReadAllText()
时会遇到访问被拒绝的问题。
直接解决方法
确保您的应用不仅检查文件是否存在,还要确认是否有读取权限。可以在尝试读取之前使用TFile.CanRead()
进行验证。
uses
System.SysUtils, System.IOUtils;
procedure ListFiles(const Dir: string; List: TStrings);
var
LList: TStringDynArray;
I: Integer;
begin
List.Clear;
LList := TDirectory.GetFiles(Dir);
for I := 0 to Length(LList) - 1 do
if TFile.CanRead(LList[I]) then // 确认文件可读
List.Add(LList[I]);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
DataDir: string;
List: TStringList;
begin
List := TStringList.Create;
try
DataDir := TPath.GetSharedDocumentsPath;
ListFiles(DataDir, List);
ShowMessage(IntToStr(List.Count) + ' ' + List.Text);
finally
List.Free;
end;
end;
此外,请注意自Android 11起,由于隐私保护政策的更新,listFiles()
仅能列出由应用本身创建的文件或部分媒体文件,即使是在共享文档路径下。因此,如果您的应用需要访问其他应用创建的文件,可能需要重新评估所使用的存储路径或请求更广泛的权限。
通过这些调整,您可以更有效地管理文件访问权限,避免因权限问题导致的功能失效。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END