Nodejs 文件夹,树结构查找问题

Nodejs 文件夹,树结构查找问题

光盘文件夹中查找文件,光盘的树结构已放在redis中。 redis中有2个集合(set),1个放文件夹名字,1个放文件名

directory:\ d1 directory:\ d2 directory:d1 d9 directory:d1 d7 directory:d2 d5 …

files:d1 1188.jpg files:d1 1199.jpg files:d7 1165.jpg files:d5 1155.jpg files:d9 1112.jpg …

下面是php的函数,测试正确。 function innodes($nodes,$meid) { global $redis; $redis->select(1); if ($redis->sIsMember(“files:”.$nodes, $meid)) return 1; else foreach ($redis->sMembers(“directory:”.$nodes) as $val) { if (innodes($val,$meid)>0) return 1; } return 0; }

node.js不用第3方库,用foreach加递归,如何写?


3 回复

好的,让我们来解决这个问题。你需要在Node.js中实现一个类似的递归函数来查找给定文件是否存在于指定的目录树结构中。我们将使用Redis中的数据结构来进行查询。

首先,我们需要连接到Redis并读取目录和文件信息。然后,我们将编写一个递归函数来遍历目录树结构,并检查文件是否存在。

以下是完整的代码示例:

const redis = require('redis');
const client = redis.createClient({
    host: 'localhost',
    port: 6379,
    db: 1 // 选择数据库1
});

client.on('error', (err) => {
    console.error("Error " + err);
});

// 递归函数用于查找文件
async function findFileInDirectory(directory, filename) {
    try {
        const filesKey = `files:${directory}`;
        const subdirectories = await client.smembers(`directory:${directory}`);

        // 检查当前目录是否有该文件
        if (await client.sismember(filesKey, filename)) {
            return true;
        }

        // 递归检查子目录
        for (let subdirectory of subdirectories) {
            if (await findFileInDirectory(subdirectory, filename)) {
                return true;
            }
        }

        return false;
    } catch (err) {
        console.error("Error: " + err);
        return false;
    }
}

// 使用示例
(async () => {
    const directory = 'd1';
    const filename = '1188.jpg';

    const result = await findFileInDirectory(directory, filename);
    if (result) {
        console.log(`文件 ${filename} 存在于目录 ${directory} 中`);
    } else {
        console.log(`文件 ${filename} 不存在于目录 ${directory} 中`);
    }
})();

解释

  1. 连接到Redis:

    • 我们使用redis.createClient()创建一个Redis客户端,并指定主机、端口和数据库。
  2. 定义递归函数:

    • findFileInDirectory(directory, filename) 是一个异步函数,用于递归地检查目录及其子目录中是否存在指定的文件。
  3. 检查当前目录:

    • 首先,我们检查当前目录(通过键files:${directory})中是否存在指定的文件。
  4. 递归检查子目录:

    • 如果当前目录中没有找到文件,则获取当前目录的所有子目录(通过键directory:${directory}),并对每个子目录递归调用findFileInDirectory()函数。
  5. 使用示例:

    • 在示例中,我们检查了目录d1中是否存在文件1188.jpg。根据返回的结果输出相应的消息。

希望这个示例对你有所帮助!


为啥要用递归呢?

针对您提供的 Node.js 代码需求,我们可以编写一个递归函数来实现类似的功能。该函数将接收两个参数:当前遍历的目录节点和目标文件ID。我们将使用 Redis 客户端来与 Redis 数据库进行交互。

首先,确保你已经安装了 redis 模块。如果没有安装,可以通过 npm 安装:

npm install redis

接下来是 Node.js 代码示例:

const redis = require('redis');

// 创建 Redis 客户端
const client = redis.createClient({
    host: 'localhost',
    port: 6379,
    db: 1 // 选择数据库
});

client.on('error', (err) => {
    console.error('Redis 错误:', err);
});

function findFile(nodes, meid, callback) {
    // 查找 files:{$nodes} 中是否包含 meid
    client.sismember(`files:${nodes}`, meid, (err, reply) => {
        if (reply === 1) {
            return callback(true); // 找到文件
        }

        // 如果没有找到文件,则递归检查子目录
        client.smembers(`directory:${nodes}`, (err, subdirs) => {
            if (!subdirs || subdirs.length === 0) {
                return callback(false); // 没有子目录,未找到文件
            }
            let found = false;

            subdirs.forEach((subdir) => {
                if (!found) {
                    findFile(subdir, meid, (result) => {
                        found = result;
                        if (found) {
                            callback(true);
                        }
                    });
                }
            });

            if (!found) {
                callback(false);
            }
        });
    });
}

// 调用示例
findFile('d1', '1199.jpg', (result) => {
    console.log(result ? '文件找到了' : '文件未找到');
});

解释

  • 首先,我们创建了一个 Redis 客户端连接到 Redis 服务器。
  • findFile 函数负责递归地查找指定文件。
  • 我们使用 sismember 方法来检查给定目录中是否存在指定文件。
  • 如果没有找到文件,我们使用 smembers 获取所有子目录,并对每个子目录递归调用 findFile
  • 一旦找到文件或所有子目录都被检查过且没有找到文件,则回调函数将被调用,返回结果。

这种方法避免了第三方库的使用,并实现了与 PHP 示例相同的功能。

回到顶部