Не работает ли FindFirst () в XE2 / Firemonkey с использованием iOS? - PullRequest
0 голосов
/ 21 ноября 2011

Для приложения iPhone Firemonkey я храню файлы (изображения) в папке 'tmp' и использую их в своем приложении. Я хочу иметь возможность очистить кэш, удалив, скажем, все файлы .jpg по требованию, но я не могу программно сопоставить их в вызове FindFirst () .

Я использую простой цикл FindFirst () / FindNext () / FindClose () для отображения (и удаления) содержимого папки.

Под окнами код работает отлично. Одно и то же приложение под iOS (iPhone) всегда возвращает значение -1 (ошибка) для вызова FindFirst () , а SearchRec.Name пусто. Я пытался использовать различные шаблоны файлов, включая '. ', но безуспешно.

Я знаю, что файлы существуют, потому что я могу читать и писать в них (как под iOS, так и под Windows) без ошибок, и их содержимое корректно. A FileExists () check также возвращает True.

Кроме того, если я указываю шаблон файла без подстановочного знака, для проверки на наличие известного файла (который на самом деле не является точкой вызова FindFirst () ), вызов никогда не возвращается (опять же, это хорошо под окнами)!

Кто-нибудь имел успех с этим под 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 ]

1 голос
/ 23 ноября 2011

Я не знаю, поставляется ли 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-файлами.

1 голос
/ 21 ноября 2011

Я не знаю, насколько хорошо FindFirst и т. Д. Поддерживаются на платформах, отличных от Windows, но я вспоминаю, как кто-то из команды Delphi однажды сказал, что подпрограммы в модуле IOUtils специально предназначены для ввода / вывода файлов.работать правильно для кроссплатформенного кодирования.Вы пытались использовать методы поиска файлов на TDirectory?

0 голосов
/ 10 января 2012

Это было исправлено в обновлении XE2 3

...