
后端Web框架【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter点击查看免费下载本文以 CodeIgniter 框架内置的 File Helper文件辅助函数为核心系统讲解其提供的 8 个文件操作函数——从文件写入、批量删除、目录枚举到文件信息采集、MIME 类型推断与权限格式转换。结合 system/helpers/file_helper.php 的源码实现与 tests/codeigniter/helpers/file_helper_test.php 的测试用例帮助开发者在控制器、模型或库中安全、高效地完成日常文件系统操作。读完本文你将掌握每个函数的参数语义、返回约定、典型用法及底层实现细节能够直接将其落地到自己的 CodeIgniter 3 项目中。加载 File HelperFile Helper 不是默认加载的辅助函数使用前需要显式加载。与所有辅助函数一样在控制器中通过以下代码加载$this-load-helper(file);也可以使用$this-load-helpers(file)复数形式批量加载。加载之后本文介绍的全部函数即为全局可用的 PHP 函数可在控制器、模型、视图乃至自定义库中直接调用。可用函数一览File Helper 共提供以下 8 个函数本文逐一展开函数作用write_file()将数据写入文件文件不存在时自动创建delete_files()递归删除目录中的所有文件get_filenames()读取目录并返回其中的全部文件名数组get_dir_file_info()读取目录并构建包含文件名、大小、日期、权限等信息的数组get_file_info()获取单个文件的指定属性信息get_mime_by_extension()依据 application/config/mimes.php 将扩展名翻译为 MIME 类型symbolic_permissions()将数字权限转换为符号表示如-rw-r--r--octal_permissions()将数字权限转换为八进制表示如644write_file()写入或创建文件write_file($path, $data[, $mode wb])参数类型说明$pathstring文件路径$datastring要写入的数据$modestringfopen()模式默认wb返回值bool写入成功返回TRUE出错返回FALSE该函数将数据写入指定路径的文件如果文件不存在会自动创建。典型用法$data Some file data; if ( ! write_file(./path/to/file.php, $data)) { echo Unable to write the file; } else { echo File written!; }可通过第三个参数指定写入模式write_file(./path/to/file.php, $data, r);默认模式为wb其中w表示以写入方式打开截断原内容b表示二进制模式在 Windows 下可避免换行符被意外转换。完整的模式选项请参考 PHP 官方fopen()手册。源码级实现细节从 file_helper.php 可以看到该函数的实际逻辑打开文件通过fopen($path, $mode)打开失败如目录不可写、路径无效时返回FALSE加锁调用flock($fp, LOCK_EX)获取独占锁防止并发写入时数据错乱——这就是文档中写入期间对该文件获取独占锁的由来循环写入使用for循环反复调用fwrite()处理部分写入partial write场景直到全部数据写完或发生错误解锁关闭flock($fp, LOCK_UN)释放锁fclose($fp)关闭句柄判定结果最后通过is_int($result)判断最后一次fwrite是否返回了整数写入字节数从而返回TRUE/FALSE。三个关键注意事项权限要求要成功写入目标文件的权限必须允许写入如果文件尚不存在则其所在目录必须可写。Linux 下可通过chmod调整目录/文件写权限。路径基准文档特别强调——路径相对于站点根目录的index.php前端控制器而不是相对于控制器或视图文件。CodeIgniter 采用前端控制器模式所有路径都以主入口文件为基准。例如入口位于仓库根目录 index.php那么./path/to/file.php即相对于该入口文件解析。独占锁如上所述写入期间函数持有LOCK_EX独占锁适合多进程/多请求环境下的安全写入。测试验证tests/codeigniter/helpers/file_helper_test.php 中test_write_file()使用vfsStream虚拟文件系统验证了向文件写入内容的场景断言返回值为TRUE。delete_files()递归删除目录内容delete_files($path[, $del_dir FALSE[, $htdocs FALSE]])参数类型说明$pathstring目录路径$del_dirbool是否同时删除目录本身$htdocsbool是否跳过删除.htaccess与首页文件返回值bool成功返回TRUE出错返回FALSE删除指定路径中包含的所有文件。基本用法delete_files(./path/to/directory/);如果第二个参数设为TRUE路径内的子目录也会被一并删除delete_files(./path/to/directory/, TRUE);源码实现与安全细节从 file_helper.php 的源码可以提炼出几个容易被忽略的行为尾部分隔符处理函数首先rtrim($path, /\\)去掉末尾的斜杠兼容 Windows 与 Unix 风格路径递归遍历使用opendir()/readdir()遍历遇到子目录且不是隐藏目录、不是符号链接时递归调用自身$htdocs保护机制当$htdocs TRUE时通过正则/^(\.htaccess|index\.(html|htm|php)|web\.config)$/i跳过删除.htaccess、index.html、index.htm、index.php和web.config这类 Web 入口/安全文件——这可以防止误删网站首页或关键配置文件目录删除规则$del_dir TRUE且当前递归层级$_level 0时才执行rmdir($path)即只删除子目录不会删除传入的根路径本身。注意文档明确提示文件必须可写或归系统所有才能被删除底层依赖unlink()。由于使用抑制错误个别文件删除失败时函数仍可能返回TRUE生产环境中应结合文件权限检查使用。get_filenames()枚举目录中的文件名get_filenames($source_dir[, $include_path FALSE])参数类型说明$source_dirstring目录路径$include_pathbool是否将完整路径包含进文件名返回值array文件名数组目录无法打开时返回FALSE接收一个服务器路径返回其中包含的所有文件名的数组将第二个参数设为TRUE可让返回的文件名带上路径前缀。典型用法$controllers get_filenames(APPPATH.controllers/);源码行为从 file_helper.php 可以看到首次调用非递归会重置静态数组$_filedata并将$source_dir通过realpath()归一化为带尾部DIRECTORY_SEPARATOR的绝对路径递归遍历所有子目录跳过以.开头的隐藏文件/目录当$include_path TRUE时存入数组的元素为$source_dir.$file完整路径否则只存文件名本身目录无法opendir()时返回FALSE因此使用前建议用is_array()或is_dir()做防御性判断。get_dir_file_info()采集目录内文件的详细信息get_dir_file_info($source_dir, $top_level_only)参数类型说明$source_dirstring目录路径$top_level_onlybool是否只检查指定目录不递归子目录返回值array包含目录内容信息的数组读取指定目录构建一个包含文件名、文件大小、日期和权限的数组。子目录默认不会被读取只有将第二个参数设为FALSE才会递归深入——因为这会是一次开销较大的操作。示例$models_info get_dir_file_info(APPPATH.models/);源码实现从 file_helper.php 可以看到递归时对每个非隐藏文件调用get_dir_file_info($source_dir.$file)即get_file_info()获取单个文件详情并额外附加relative_path键记录其所在目录。返回的每个元素结构即get_file_info()的默认结果见下文加上relative_path字段。get_file_info()获取单个文件属性get_file_info($file[, $returned_values array(name, server_path, size, date)])参数类型说明$filestring文件路径$returned_valuesarray/string需要返回的信息类型返回值array指定文件的信息数组文件不存在返回FALSE给定文件路径返回可选的name、path、size和date modified等信息。第二个参数允许显式声明需要返回的信息。有效的$returned_values选项为name、size、date、readable、writeable、executable和fileperms。从 源码 看实际支持且测试覆盖的键包括namebasename()、server_path原路径、sizefilesize()、datefilemtime()修改时间、readableis_readable()、writableis_really_writable()、executableis_executable()、filepermsfileperms()。两个值得注意的用法细节第二个参数可传字符串源码在is_string($returned_values)时按逗号explode(,, ...)拆分因此get_file_info($file, name, size, date)与传数组等效——这一点在 测试用例 中同时验证了数组与逗号分隔字符串两种传参方式writable使用增强版判断is_really_writable()定义于 system/core/Common.php它在 Unix 上直接使用is_writable()在 Windows 服务器或safe_mode开启的环境中会实际写入再删除一个临时文件来验证可写性规避is_writable()在 Windows 下受只读属性影响误报的问题参见 PHP bug #54709 说明。测试中还验证了文件不存在时返回FALSEtest_get_file_info中传入i_am_bad_boo断言assertFalse。get_mime_by_extension()按扩展名推断 MIME 类型get_mime_by_extension($filename)参数类型说明$filenamestring文件名返回值string/boolMIME 类型字符串无法确定时返回FALSE依据 application/config/mimes.php 将文件扩展名翻译成 MIME 类型无法确定类型或无法读取 MIME 配置文件时返回FALSE。示例$file somefile.png; echo $file. is has a mime type of .get_mime_by_extension($file);源码实现与重要警示从 file_helper.php 的源码可以看到内部流程使用static $mimes缓存 MIME 表仅首次调用时加载MIME 表来自get_mimes()——该函数定义于 system/core/Common.php加载APPPATH.config/mimes.php若存在APPPATH.config/.ENVIRONMENT./mimes.php环境专属配置则用array_merge合并覆盖随后缓存通过substr(strrchr($filename, .), 1)截取最后一个点之后的扩展名并转小写在 MIME 表中查找如果某扩展名对应数组多个候选 MIME例如png、csv、pdf在配置文件中就是数组形式则返回第一个元素current($mimes[$extension])对应字符串则直接返回未命中返回FALSE。安全警告文档明确指出这不是判断文件真实 MIME 类型的可靠方式仅出于便利性提供绝不能用于安全目的例如不能仅凭扩展名白名单就放行上传文件。真实文件类型检测应使用finfofileinfo 扩展等基于文件内容的方案。测试验证tests/codeigniter/helpers/file_helper_test.php 的test_get_mime_by_extension()覆盖三种情形.txt返回text/plainfoo.pngMIME 表项为数组返回第一个元素image/png未收录的扩展名foo.blarfengar返回FALSE。symbolic_permissions()数字权限转符号表示symbolic_permissions($perms)参数类型说明$permsint权限值如fileperms()的返回值返回值string符号权限字符串接收数字权限例如fileperms()的返回值返回标准的符号表示法。示例echo symbolic_permissions(fileperms(./index.php)); // -rw-r--r--从 源码 看该函数通过位掩码逐位解析文件类型首字符依次检测套接字s、符号链接l、普通文件-、块设备b、目录d、字符设备c、FIFO 管道p未知类型显示u所有者/组/其他三组分别按r读、w写、x执行组合并正确处理 setuids/S、setgids/S与 sticky bitt/T的显示——小写表示对应位生效大写表示权限位未设置但特殊位已置位。需要说明的是测试test_symbolic_permissions()使用vfsStream虚拟文件系统其权限值组合在首字符判定上会落入未知分支显示u断言为urwxrwxrwx这是虚拟文件系统的特性对真实文件系统如index.php则会正确输出-rw-r--r--之类的结果。octal_permissions()数字权限转八进制表示octal_permissions($perms)参数类型说明$permsint权限值如fileperms()的返回值返回值string三位八进制权限字符串接收数字权限例如fileperms()的返回值返回三位八进制表示。示例echo octal_permissions(fileperms(./index.php)); // 644源码实现从 file_helper.php 可以看到实现非常简洁return substr(sprintf(%o, $perms), -3);即先将权限值格式化为八进制字符串再截取最后三位。例如权限0644显示为644。测试 test_octal_permissions 使用0777权限的文件断言输出777。与 symbolic_permissions() 的配合使用两个权限函数相辅相成octal_permissions()输出机器可读、适合存储和比较的三位数字如755、644symbolic_permissions()输出人类可读、适合日志和调试输出的ls -l风格字符串如-rw-r--r--。两者都接收fileperms()的原始整数返回值可组合用于构建文件管理界面或调试脚本。综合实战示例将上述函数组合使用可以快速实现一个缓存目录清理 信息盘点的典型场景$this-load-helper(file); // 1. 写入缓存文件 if (write_file(APPPATH.cache/tmp_data.php, ?php return array();, wb)) { echo Cache written; } // 2. 获取缓存文件信息 $info get_file_info(APPPATH.cache/tmp_data.php, array(name, size, date, fileperms)); echo Size: .$info[size]. bytes.PHP_EOL; echo Permissions: .symbolic_permissions($info[fileperms]). (.octal_permissions($info[fileperms]).).PHP_EOL; // 3. 列出并清理缓存目录保留 .htaccess $files get_filenames(APPPATH.cache/); if (is_array($files) ! empty($files)) { delete_files(APPPATH.cache/, TRUE, TRUE); echo Cache cleaned, .count($files). files removed; }总结与最佳实践路径基准File Helper 中所有路径均相对于站点入口 index.php而非控制器/视图跨平台开发时优先使用APPPATH、FCPATH等常量拼接绝对路径。权限意识write_file()依赖目标文件或所在目录可写delete_files()依赖文件可写或属主匹配Linux 部署后务必检查目录权限与属主。并发安全write_file()内置flock(LOCK_EX)独占锁适合高并发写入场景无需自行再加锁。安全性边界get_mime_by_extension()仅按扩展名推断不可用于上传校验等安全场景隐藏文件以.开头默认被get_filenames()、get_dir_file_info()跳过。源码与测试参考完整实现见 system/helpers/file_helper.php行为验证见 tests/codeigniter/helpers/file_helper_test.phpMIME 映射表位于 application/config/mimes.php可通过环境专属配置application/config/{ENVIRONMENT}/mimes.php覆盖或扩充。赞分享后端Web框架【免费下载链接】CodeIgniterOpen Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter点击查看免费下载相关推荐Realm Swift SDK 删除 Realm 文件完整指南安全删除、deleteRealmIfMigrationNeeded 与辅助文件清理Realm Swift SDK 删除 Realm 文件完整指南安全删除、deleteRealmIfMigrationNeeded 与辅助文件清理 在 Real数据库移动开发嵌入式数据库StarRocks DROP FILE 语句完全指南从权限、语法到 SmallFileMgr 底层删除原理StarRocks DROP FILE 语句完全指南从权限、语法到 SmallFileMgr 底层删除原理 DROP FILE 是 StarRocks 用于删数据库OLAP数据仓库大数据湖仓一体数据分析DataHub Metadata File 接入指南file Source 的配置、文件格式与状态化删除检测详解DataHub Metadata File 接入指南file Source 的配置、文件格式与状态化删除检测详解 导读 Metadata File元数据文件数据目录数据治理数据血缘后端前端数据工程数据集成上一篇Comedy框架源码解析核心组件的设计与实现原理下一篇Vulkan 游戏也能增强reshade-steam-proton 实验性功能开启与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考