在使用iOS的XE2 / Firemonkey下是否有FindFirst()错误?

时间:2011-11-21 04:43:42

标签: ios delphi freepascal firemonkey

对于iPhone Firemonkey应用程序,我将文件(图像)存储在'tmp'文件夹中,并在我的应用程序中使用它们。我希望能够通过删除所有'.jpg'文件按需刷新缓存,但我似乎无法在 FindFirst()调用中以编程方式匹配它们。

我使用简单的 FindFirst()/ FindNext()/ FindClose()循环来列出(和删除)文件夹的内容。

在Windows下,代码完美无缺。 iOS(iPhone)下的相同应用程序始终为 FindFirst()调用返回值-1(错误), SearchRec.Name 为空。我尝试过使用各种文件模式,包括'',但没有成功。

我知道这些文件存在是因为我可以在没有错误的情况下读取和写入它们(在iOS和Windows下),并且它们的内容是正确的。 FileExists()检查也会返回True。

另外,如果我指定一个没有通配符的文件模式,要检查一个已知文件(实际上不是 FindFirst()调用的点),调用永远不会返回(再次这在windows下很好!

有没有人在iOS下取得任何成功,可以提出任何想法?

谢谢,

编辑:请求的代码段,用于演示此问题。 注意:_sFolderName包含我已确认的缓存文件夹名称肯定是正确的。

function GetCacheFileList : string;
var
  iResult: integer;
  sr: TSearchRec;
  sPath,
  sTemp: string;
  sFilename : TFilename;
begin
  sTemp     := '';
  sFilename := _sFolderName + '*.jpg';
  //
  iResult := FindFirst(sFilename, faAnyFile, sr);  // ALWAYS RETURNS -1 under iOS
  while (iResult = 0) do
  begin
    sTemp := sTemp + sr.Name + sLineBreak;
    iResult := FindNext(sr)
  end; { while }
  //
  FindClose(sr);
  Result := sTemp
end;

3 个答案:

答案 0 :(得分:1)

我不知道在非Windows平台上支持FindFirst等有多好,但我确实记得Delphi团队的某个人曾说过IOUtils单元中的例程专门用于生成文件I / O适用于跨平台编码。您是否尝试过使用TDirectory上的文件搜索方法?

答案 1 :(得分:1)

我不知道Delphi XE 2是否带有来自iOS SDK的标头,但您可以为FreePascal(read here)生成它们。然后通过标准API使用此方法:

{$modeswitch objectivec1}

uses
  iPhoneAll, CFBase, CFString;

type
  TFileList = record
    Count : Integer;
    Items : array of String;
end;

procedure file_Find( const Directory : String; var List : TFileList; FindDir : Boolean = FALSE );
  var
    i           : Integer;
    fileManager : NSFileManager;
    dirContent  : NSArray;
    path        : NSString;
    fileName    : array[ 0..255 ] of Char;
    error       : NSErrorPointer;
    isDirectory : Boolean;
begin
  fileManager := NSFileManager.alloc().init();
  path        := NSString( CFStr( PChar( Directory ) ) );
  dirContent  := fileManager.contentsOfDirectoryAtPath_error( path, error );
  List.Count  := 0;
  fileManager.changeCurrentDirectoryPath( path );
  for i := 0 to dirContent.count() - 1 do
    begin
      if FindDir Then
        begin
          if ( fileManager.fileExistsAtPath_isDirectory( dirContent.objectAtIndex( i ), @isDirectory ) ) and ( not isDirectory ) Then continue;
        end else
          if ( fileManager.fileExistsAtPath_isDirectory( dirContent.objectAtIndex( i ), @isDirectory ) ) and ( isDirectory ) Then continue;

      SetLength( List.Items, List.Count + 1 );
      FillChar( fileName[ 0 ], 256, 0 );
      CFStringGetCString( CFStringRef( dirContent.objectAtIndex( i ) ), @fileName[ 0 ], 255, kCFStringEncodingUTF8 );
      List.Items[ List.Count ] := PChar( @fileName[ 0 ] );
      INC( List.Count );
    end;
  fileManager.dealloc();
end;

此函数返回记录TFileList,其中包含所有找到的文件(或目录)的数组。然后你可以只分析文件的名称并用jpg文件做一些事情。

答案 2 :(得分:0)

这已在XE2 update 3

下修复