PHP能否使用mkdir在Windows lnk快捷方式指向路径中创建目录?
这个需求可以实现,核心问题是你混淆了Windows快捷方式(.lnk文件)和系统符号链接的区别,PHP原生文件系统函数不会自动解析.lnk文件内的目标路径。
原因说明
- scandir能扫到test.lnk是因为它仅遍历目录下的所有文件名,不解析文件内容,所以正常返回。
- is_link函数仅识别类Unix系统的软链接、Windows系统原生符号链接(通过mklink命令创建),.lnk是Windows Explorer定义的专属二进制格式文件,本质是普通文件,所以is_link判定结果永远为false。
解决步骤
- 先编写函数解析.lnk文件二进制内容,提取其指向的目标路径,示例实现如下:
function get_lnk_target(string $lnk_file_path): string|false { // 读取lnk文件二进制内容 $lnk_content = file_get_contents($lnk_file_path); // 校验lnk文件头标识 if (substr($lnk_content, 0, 4) !== "L\x00\x00\x00") { return false; } // 简化版解析逻辑,适配绝大多数常规lnk文件 $offset = 0x4C; $id_list_size = unpack('v', substr($lnk_content, $offset, 2))[1]; $offset += 2 + $id_list_size + 4; $base_path_size = unpack('v', substr($lnk_content, $offset, 2))[1]; $offset += 2; $target_path = substr($lnk_content, $offset, $base_path_size); // 转换Windows UTF-16LE编码为通用UTF-8 return rtrim(mb_convert_encoding($target_path, 'UTF-8', 'UTF-16LE'), "\0"); }
- 调用函数获取目标路径,拼接你要创建的上传目录路径,再执行创建逻辑:
// 读取lnk指向的目标路径 $lnk_target = get_lnk_target('/uploads/test/test.lnk'); if (!$lnk_target) { die('无效的lnk文件'); } // 拼接要创建的上传目录完整路径,示例是在目标路径下新建upload_dir目录 $upload_dir = $lnk_target . DIRECTORY_SEPARATOR . 'upload_dir'; // 执行目录创建逻辑,加递归参数避免多级目录创建失败 if (!is_dir($upload_dir)) { mkdir($upload_dir, 0755, true); }
注意事项
- 若PHP运行在非Windows环境下,解析得到的Windows格式路径(如
C:\files\test)需要自行做路径映射后才能正常读写 - 需确保PHP运行用户对目标路径拥有读写权限,否则目录创建会失败
内容的提问来源于stack exchange,提问作者Ken Hart
相关产品推荐
相关产品推荐

