在Delphi 11中TDirectory.GetFiles()无法正常工作

欢迎加入全网最大Delphi 技术交流群 682628230

在从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
喜欢就支持一下吧
点赞11 分享