IOS下面如果文件夹中的文件名包含特殊字符Delphi无法取到

TDirectory.GetFiles方法用的是linux的函数,对特殊字符的文件会认为是目录导致无法取得列表

下面这个函数用NSFileManager绕过了这个问题

  1.  
  2.  
  3. function GetFiles(APath:string):TStringDynArray;
  4.  
  5. var
  6.  
  7. fm:NSFileManager;
  8.  
  9. files:NSArray;
  10.  
  11. I: Integer;
  12.  
  13. list:TStrings;
  14.  
  15. f:string;
  16.  
  17. isDir:boolean;
  18.  
  19. begin
  20.  
  21. fm := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager);
  22.  
  23. files:=fm.contentsOfDirectoryAtPath(StrToNSStr(APath), nil);
  24.  
  25.  
  26.  
  27. list:=TStringList.Create;
  28.  
  29. try
  30.  
  31. for I := 0 to files.count-1 do
  32.  
  33. begin
  34.  
  35. f:=TPath.Combine(APath, NSStrToStr(TNSString.Wrap(files.objectAtIndex(i))));
  36.  
  37. isDir:=False;
  38.  
  39. fm.fileExistsAtPath(StrToNSStr(f), @isDir);
  40.  
  41. if isDir then
  42.  
  43. Continue;
  44.  
  45. list.Add(f);
  46.  
  47. end;
  48.  
  49. SetLength(result, list.count);
  50.  
  51. for I := 0 to list.count-1 do
  52.  
  53. begin
  54.  
  55. result[i]:=list[I];
  56.  
  57. end;
  58.  
  59. finally
  60.  
  61. list.Free;
  62.  
  63. end;
  64.  
  65. end;
  66.  
  67.  
  68.  
  69. function GetDirectories(APath:string):TStringDynArray;
  70.  
  71. var
  72.  
  73. fm:NSFileManager;
  74.  
  75. files:NSArray;
  76.  
  77. I: Integer;
  78.  
  79. list:TStrings;
  80.  
  81. f:string;
  82.  
  83. isDir:boolean;
  84.  
  85. begin
  86.  
  87. fm := TNSFileManager.Wrap(TNSFileManager.OCClass.defaultManager);
  88.  
  89. files:=fm.contentsOfDirectoryAtPath(StrToNSStr(APath), nil);
  90.  
  91.  
  92.  
  93. list:=TStringList.Create;
  94.  
  95. try
  96.  
  97. for I := 0 to files.count-1 do
  98.  
  99. begin
  100.  
  101. f:=TPath.Combine(APath, NSStrToStr(TNSString.Wrap(files.objectAtIndex(i))));
  102.  
  103. isDir:=False;
  104.  
  105. fm.fileExistsAtPath(StrToNSStr(f), @isDir);
  106.  
  107. if not isDir then
  108.  
  109. Continue;
  110.  
  111. list.Add(f);
  112.  
  113. end;
  114.  
  115. SetLength(result, list.count);
  116.  
  117. for I := 0 to list.count-1 do
  118.  
  119. begin
  120.  
  121. result[i]:=list[I];
  122.  
  123. end;
  124.  
  125. finally
  126.  
  127. list.Free;
  128.  
  129. end;
  130.  
  131. end;