【问题标题】:TDirectory.GetFiles() is not working in Delphi 11TDirectory.GetFiles() 在 Delphi 11 中不起作用
【发布时间】:2022-11-14 02:57:11
【问题描述】:

在 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.

【问题讨论】:

  • 两个版本中指定了哪些 Android API 目标?
  • 对于 Delphi 10.4,它是 31,对于 Delphi 11,它是 32。

标签: android delphi permissions delphi-11-alexandria


【解决方案1】:

这将列出文件:

        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;

【讨论】:

  • 但是,至少对我来说,Android 上的 Delphi 11 没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 2018-05-15
  • 2015-05-06
相关资源
最近更新 更多