如何在Delphi iOS应用的沙箱文件夹中移除只读属性?
如何在Delphi iOS应用的沙箱文件夹中移除只读属性?
我太懂你这个烦恼了——iTunes Windows版同步完,好好的Documents文件夹突然就变只读,自己的App都没法操作里面的文件,简直离谱!这本质上是iTunes同步后给文件夹和文件加上了POSIX只读权限,而iOS用的是POSIX权限模型,所以之前试的Windows那套faReadOnly属性完全不管用。
下面给你一套在Delphi iOS应用里能直接用的解决方案,不仅能修复目标文件夹的权限,还能递归处理里面所有的子文件夹和文件:
步骤1:准备权限修正的递归函数
我们需要写一个递归函数,先修改当前文件夹的权限,再遍历里面的所有内容,把文件和子文件夹的权限也一并修正:
uses System.IOUtils, System.SysUtils, Posix.Base; procedure FixFolderPermissions(const FolderPath: string); var LSearchRec: TSearchRec; LFullPath: string; begin // 先修正当前文件夹的权限:所有者/组/其他都拥有读、写、执行权限 if chmod(PChar(FolderPath), &777) = -1 then begin // 这里可以加日志记录,方便排查修改失败的情况 // 比如用自定义日志组件记录错误信息 end; // 遍历文件夹内的所有文件和子文件夹 if FindFirst(TPath.Combine(FolderPath, '*'), faAnyFile, LSearchRec) = 0 then begin try repeat // 跳过当前目录和父目录的占位符 if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then begin LFullPath := TPath.Combine(FolderPath, LSearchRec.Name); if (LSearchRec.Attr and faDirectory) <> 0 then begin // 递归处理子文件夹 FixFolderPermissions(LFullPath); end else begin // 修正文件权限:所有者/组/其他都拥有读、写权限(文件不需要执行权限) if chmod(PChar(LFullPath), &666) = -1 then begin // 同样可以在这里记录文件权限修改失败的日志 end; end; end; until FindNext(LSearchRec) <> 0; finally FindClose(LSearchRec); end; end; end;
步骤2:在合适的时机调用这个函数
你可以在App启动完成后,或者在需要访问目标文件夹之前调用这个函数,比如在主窗体的创建事件里:
procedure TMainForm.FormCreate(Sender: TObject); var LTargetFolder: string; begin // 拼接目标文件夹的完整路径 LTargetFolder := TPath.Combine(TPath.GetDocumentsPath, 'Chess Openings Wizard 2016'); // 如果文件夹存在,就执行权限修正 if TDirectory.Exists(LTargetFolder) then begin FixFolderPermissions(LTargetFolder); end; end;
为什么这个方案管用?
iOS沙箱里,你的App对自己Documents目录下的所有内容拥有完全控制权,chmod是POSIX标准的权限修改函数,能直接修改iOS文件系统的权限属性——这正是iTunes同步后被篡改的部分。我们设置的&777(八进制)能让文件夹恢复可读写执行的权限,&666能让文件恢复可读写权限,完全适配iOS的权限模型。
注意要确保你的Delphi项目引用了Posix.Base单元,不然chmod函数会找不到哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

