You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP能否使用mkdir在Windows lnk快捷方式指向路径中创建目录?

这个需求可以实现,核心问题是你混淆了Windows快捷方式(.lnk文件)和系统符号链接的区别,PHP原生文件系统函数不会自动解析.lnk文件内的目标路径。

原因说明

  • scandir能扫到test.lnk是因为它仅遍历目录下的所有文件名,不解析文件内容,所以正常返回。
  • is_link函数仅识别类Unix系统的软链接、Windows系统原生符号链接(通过mklink命令创建),.lnk是Windows Explorer定义的专属二进制格式文件,本质是普通文件,所以is_link判定结果永远为false。

解决步骤

  1. 先编写函数解析.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");
}
  1. 调用函数获取目标路径,拼接你要创建的上传目录路径,再执行创建逻辑:
// 读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:54:04