0

iPhone Firemonkey アプリケーションの場合、ファイル (画像) を「tmp」フォルダに保存し、アプリケーションで使用しています。必要に応じてすべての「.jpg」ファイルを削除してキャッシュをフラッシュできるようにしたいのですが、FindFirst()呼び出しでプログラム的に一致させることができないようです。

単純なFindFirst() / FindNext() / FindClose()ループを使用して、フォルダーの内容を一覧表示 (および削除) しています。

ウィンドウの下では、コードは完全に機能します。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 に答える