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

zaqlnxep  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(220)

在 Delphi 10.4中,我可以得到Android设备共享存储中的文件列表。在Delphi 11中,通过设置必要的权限(无论是通过编程还是在设备上),TDirectory.GetFiles()返回一个空列表(即零个条目)。
TDirectory.GetDirectories()工作正常,使用TFile.Exists()和已知存在的文件名返回true。但是,如果我尝试使用例如TFile.ReadAllText()打开该文件,访问将被拒绝。有什么建议吗?
这是一个在 Delphi 11中失败的示例程序:

uses
  System.Types,System.Classes,system.sysUtils,system.IOUtils,system.Permissions,
 {$IFDEF ANDROID}
   Androidapi.Helpers,
   Androidapi.JNI.JavaTypes,
   Androidapi.JNI.Os,
 {$ENDIF}
  FMX.Types,FMX.Forms,FMX.Dialogs;

type
  TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
  private
   fOK:boolean;
   procedure PermissionsResult(Sender: TObject;
      const APermissions: TClassicStringDynArray;
      const AGrantResults: TClassicPermissionStatusDynArray);
  end;

var
  Form1: TForm1;

implementation
{$R *.fmx}

procedure Tform1.PermissionsResult(Sender: TObject;
  const APermissions: TClassicStringDynArray;
  const AGrantResults: TClassicPermissionStatusDynArray);
 var
  n:integer;
 begin
  if length(AGrantResults)>0 then
   for n:=0 to length(AGrantResults)-1 do
    if not (AGrantResults[n] = TPermissionStatus.Granted) then fOK:=false;
 end;

procedure FileList(dir:string;list:TstringList);
 var
  LList: TStringDynArray;
  I: Integer;
 begin
  list.Clear;
  Llist:=Tdirectory.GetFiles(dir);
  if length(LList)>0 then
   for I := 0 to Length(LList) - 1 do
    list.Add(LList[I]);
 end;

procedure TForm1.FormCreate(Sender: TObject);
 var
  DataDir:string;
  list:TstringList;
  p:Tarray<string>;
 begin
  fOK:=true;
  p:=[JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE),
        JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE)];
  PermissionsService.RequestPermissions(p,PermissionsResult,nil);
  if fOK then
   begin
    list:=TstringList.Create;
    DataDir := TPath.GetSharedDocumentsPath;
showmessage(DataDir);
    fileList(DataDir,list);
showmessage(inttostr(list.Count)+' '+list.Text);
    list.Free;
   end else showmessage('permission refused');
 end;

end.
pdkcd3nj

pdkcd3nj1#

在Android 11+设备上,listFiles()将根据具体的公共目录,仅列出应用本身创建的文件或一些媒体文件。
在尝试读取之前,不要只使用TFile.Exists(),也要使用TFile.CanRead()。

cbjzeqam

cbjzeqam2#

这将列出文件:

var
  FileList: TStringDynArray;
  myfileList: Tstringlist;
  s: string;
  DocDir: string; 
begin
  DocDir := TPath.GetSharedDocumentsPath;// or whatever path
  FileList := TDirectory.GetFiles(DocDir);
  myfileList := TStringList.Create;

  for s in FileList do begin //get all items in folder
    if Pos('.png',s) > 0 then begin
      try  
        myfileList.Add(s);             
      except
        //
      end;  
    end;
  end;
  myfileList.Free;  
end;

相关问题