iOSデバイスをたとえば次のように設定します。ベトナム、その後、次のコードは、を失敗し、時には:特定のデバイス言語でiOSでTFileStream.Createが失敗する
var
lFilePath: String
...
lFilePath := TPath.GetTempPath + '/MyDBfile.db';
lFileStream := TFileStream.Create(lFilePath, fmOpenReadWrite or fmShareExclusive or fmCreate);
TFileStream.Createコールがアサートを発生させます:"EFCreateError:ファイルを作成できません" /民間の/ var /モバイル/コンテナ/データ/アプリケーション/ {ContainerIDの} /tmp/MyDBfile.db " このようなファイルまたはディレクトリはありません"。 デバイスが特定の言語(ベトナム語を含む)に設定されている場合にのみ、アサーションは西欧言語では発生しません。
私はSystem.SysUtils
にダウンFileCreate
機能のこの行のコードを作成し、トレース:
FileHandle := Integer(__open(M.AsAnsi(FileName, CP_UTF8).ToPointer,
O_RDWR or O_CREAT or O_TRUNC or Exclusive[(Mode and $0004) shr 2], Rights));
FILEHANDLEがある-1アサートが発生したとき。
何が間違っていますか?
PS:
lFilePath := TPath.GetTempPath + '/MyDBfile.db';
if Fileexists(lFilePath) then
System.Sysutils.DeleteFile(lFilePath);
lFileStream := TFileStream.Create(lFilePath, fmOpenReadWrite or fmShareExclusive or fmCreate);
は今、コードが失敗した状況で、私は以下の奇妙な知見を持っている:何が起こるかを見つけるために私の試みで、私はFileexists
コールを追加Xcodeで を、アプリケーションのコンテナを表示することができます。コンテナ内にファイルtmp/MyDBfile.db
が表示されます。つまり、ファイルは存在します(ファイルは引用されたコードでのみ作成されるため、コードが成功した時の1つです)。ただし、同時にFileexists
はfalseを返します。
このファイルは、後でsqlite3_open_v2
で開かれた後すぐにsqlite3_close
で閉じるSQLiteファイルです。 SQLiteはFileexistsがfalseを返す状態にファイルを置くことができますか? (アプリケーションを再起動しても状態は変わらない)
'lFilePath'を持っているどのタイプ? –
@KeremDその文字列、私はちょうどそれを含める質問を更新しました。実際に私は問題を解決したと思うが、ここに投稿する前に問題を報告したベトナムの顧客からの最終確認を待っている。私が見つけたものから、TPath.GetTempPathは間違った方法でtmpパスを取得しますが、これはベトナム語や他のいくつかの言語でのみ失敗します... – Hans