0

对于 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;
4

3 回答 3

1

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

于 2011-11-21T05:06:31.140 回答
1

我不知道 Delphi XE 2 是否附带 iOS SDK 的标头,但您可以为 FreePascal 生成它们(请阅读此处)。然后通过标准 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 文件做一些事情。

于 2011-11-23T11:31:54.263 回答
0

这已在 XE2 更新 3 下修复

于 2012-01-10T03:17:43.417 回答