解析目录树文件并创建对应的文件和目录

目录树示例 (directory_tree.txt)

- project/
    - src/
        - Core/
            - Application.php
            - Router.php
        - Controllers/
            - HomeController.php
            - UserController.php
        - Models/
            - User.php
            - Product.php
        - Views/
            - home/
                - index.php
            - user/
                - profile.php
    - tests/
        - unit/
            - Core/
                - ApplicationTest.php
                - RouterTest.php
            - Controllers/
                - HomeControllerTest.php
                - UserControllerTest.php
        - integration/
            - ApiTests/
                - UserApiTest.php
    - public/
        - index.php
        - assets/
            - css/
                - styles.css
            - js/
                - scripts.js
            - images/
                - logo.png
    - config/
        - database.php
        - app.php
    - vendor/
    - logs/
        - app.log
    - README.md
    - composer.json
    - LICENSE

目录树说明

  1. project/
    项目根目录。

  2. src/
    源代码目录,包含核心代码、控制器、模型和视图。

    • Core/
      核心框架类,如 Application.phpRouter.php
    • Controllers/
      控制器类,如 HomeController.phpUserController.php
    • Models/
      模型类,如 User.phpProduct.php
    • Views/
      视图文件,按功能分类存放。
  3. tests/
    测试目录,包含单元测试和集成测试。

    • unit/
      单元测试,按模块分类。
    • integration/
      集成测试,如 API 测试。
  4. public/
    公共资源目录,存放可通过 Web 访问的文件。

    • index.php
      入口文件。
    • assets/
      静态资源文件,如 CSS、JavaScript 和图片。
  5. config/
    配置文件目录,存放数据库配置和应用配置。

  6. vendor/
    Composer 依赖目录(通常不需要手动创建)。

  7. logs/
    日志文件目录,存放应用日志。

  8. README.md
    项目说明文档。

  9. composer.json
    Composer 配置文件。

  10. LICENSE
    开源许可证文件。


使用 PHP 代码解析目录树

将上述目录树保存为 directory_tree.txt,然后运行以下 PHP 代码:

<?php

/**
 * 递归删除目录及其内容
 *
 * @param string $dir 要删除的目录路径
 */
function deleteDirectory(string $dir): void
{
    if (!is_dir($dir)) {
        return;
    }

    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item === '.' || $item === '..') {
            continue;
        }

        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) {
            // 递归删除子目录
            deleteDirectory($path);
        } else {
            // 删除文件
            unlink($path);
            echo "删除文件:$path\n";
        }
    }

    // 删除空目录
    rmdir($dir);
    echo "删除目录:$dir\n";
}

/**
 * 解析目录树文件并创建对应的文件和目录
 *
 * @param string $inputFile 包含目录树结构的文件路径
 * @param string $baseDir 基础目录(生成的文件和目录将创建在此目录下)
 */
function createDirectoryTreeFromFile(string $inputFile, string $baseDir): void
{
    if (!file_exists($inputFile)) {
        die("输入文件不存在:$inputFile\n");
    }

    // 读取文件内容
    $lines = file($inputFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (empty($lines)) {
        die("文件内容为空\n");
    }

    // 如果基础目录存在,先删除其内容
    if (is_dir($baseDir)) {
        echo "清理基础目录:$baseDir\n";
        deleteDirectory($baseDir);
    }

    // 重新创建基础目录
    mkdir($baseDir, 0755, true);

    // 用于跟踪当前嵌套目录
    $currentDepth = 0;
    $currentPath = [$baseDir]; // 当前路径栈

    foreach ($lines as $line) {
        // 计算缩进级别
        $indentLevel = strlen($line) - strlen(ltrim($line));
        $depth = intval($indentLevel / 4); // 假设每级缩进为 4 个空格

        // 调整当前路径栈
        while ($depth < $currentDepth) {
            array_pop($currentPath);
            $currentDepth--;
        }

        // 去除行首的缩进和列表标记
        $line = trim($line, " -\t\n\r\0\x0B");

        // 判断是否是目录
        if (substr($line, -1) === '/') {
            // 创建目录
            $dirName = rtrim($line, '/');
            $dirPath = implode(DIRECTORY_SEPARATOR, $currentPath) . DIRECTORY_SEPARATOR . $dirName;
            if (!is_dir($dirPath)) {
                mkdir($dirPath, 0755, true);
                echo "创建目录:$dirPath\n";
            }
            // 更新当前路径栈
            $currentPath[] = $dirName;
            $currentDepth++;
        } else {
            // 创建文件
            $filePath = implode(DIRECTORY_SEPARATOR, $currentPath) . DIRECTORY_SEPARATOR . $line;
            if (!file_exists($filePath)) {
                touch($filePath);
                echo "创建文件:$filePath\n";
            }
        }
    }
}

// 示例用法
$inputFile = __DIR__ . '/directory_tree.txt'; // 包含目录树结构的文件
$baseDir = __DIR__ . '/project'; // 基础目录(生成的文件和目录将创建在此目录下)

createDirectoryTreeFromFile($inputFile, $baseDir);

运行结果

运行代码后,会在 project 目录下生成以下文件和目录:

project/
├── src/
│   ├── Core/
│   │   ├── Application.php
│   │   └── Router.php
│   ├── Controllers/
│   │   ├── HomeController.php
│   │   └── UserController.php
│   ├── Models/
│   │   ├── User.php
│   │   └── Product.php
│   └── Views/
│       ├── home/
│       │   └── index.php
│       └── user/
│           └── profile.php
├── tests/
│   ├── unit/
│   │   ├── Core/
│   │   │   ├── ApplicationTest.php
│   │   │   └── RouterTest.php
│   │   └── Controllers/
│   │       ├── HomeControllerTest.php
│   │       └── UserControllerTest.php
│   └── integration/
│       └── ApiTests/
│           └── UserApiTest.php
├── public/
│   ├── index.php
│   └── assets/
│       ├── css/
│       │   └── styles.css
│       ├── js/
│       │   └── scripts.js
│       └── images/
│           └── logo.png
├── config/
│   ├── database.php
│   └── app.php
├── vendor/
├── logs/
│   └── app.log
├── README.md
├── composer.json
└── LICENSE

注意事项

  1. 缩进格式

    • 确保 directory_tree.txt 中的缩进格式一致(例如每级缩进为 4 个空格)。
  2. 文件内容

    • 生成的文件是空文件。如果需要初始化文件内容,可以在 touch 后使用 file_put_contents 写入内容。
  3. 权限问题

    • 确保 PHP 脚本有权限创建目录和文件。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容