sqlite记录目录信息,如果OS操作目录被修改,我怎么才能和sqlite同步数据?

有这样一个需求,就是想要使用sqlite记录目录的信息,
比如:

/aaa/bbb/ccc/ 

这个目录,我想要对其做sqlite记录其元信息,比如tag之类,这个好实现。

但是现在有一个场景就是,如果/aaa/bbb/ccc在OS中被剪切走了,或者删除了,我怎么更新我的sqlite数据呢?如何触发?或者有没有迂回的方式做到sqlite知道它被修改了?


因为我的程序不是一直运行状态的,所以我只能打开软件的时候进行同步。

阅读 902
avatarAI BotBETA

你可以通过监视文件系统事件来实现与SQLite数据的同步。以下是一种可能的方法,使用Node.js和fs模块:

首先,你需要安装一个名为fs-extra的Node.js库,它提供了一些额外的文件系统方法。可以通过npm安装:

npm install fs-extra

然后,你可以创建一个脚本来监视特定目录的更改,并在检测到更改时更新SQLite数据。下面是一个基本的例子:

const fs = require('fs-extra');
const sqlite3 = require('sqlite3').verbose();

// SQLite数据库连接
const db = new sqlite3.Database(':memory:');

// 创建表格
db.serialize(() => {
  db.run('CREATE TABLE IF NOT EXISTS directories (path TEXT PRIMARY KEY, tag TEXT)');
});

// 监视目录更改的函数
function watchDirectory(path) {
  fs.watch(path, (eventType, filename) => {
    // 如果事件类型是'rename'(即文件或目录被重命名或移动),则更新SQLite数据
    if (eventType === 'rename') {
      // 先移除旧的记录
      db.all(`DELETE FROM directories WHERE path = ?`, [path], (err) => {
        if (err) console.error(err);
      });

      // 如果有新的目录,添加新的记录
      fs.stat(path, (err, stats) => {
        if (err) console.error(err);
        else if (stats.isDirectory()) {
          db.run(`INSERT INTO directories (path, tag) VALUES (?, ?)`, [path, 'new tag'], (err) => {
            if (err) console.error(err);
          });
        }
      });
    }
  });
}

// 开始监视目录
watchDirectory('/aaa/bbb/ccc');

请注意,这是一个基本的例子,可能需要根据你的具体需求进行修改和改进。例如,你可能需要处理错误,添加更复杂的逻辑以处理多种情况(如文件和目录的创建、删除、移动等),或者优化性能。

1 个回答

文件系统监控:

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class MyHandler(FileSystemEventHandler):
    def on_modified(self, event):
        # 当文件或目录被修改时调用
        print(f'Event type: {event.event_type}  path : {event.src_path}')
        # 这里你可以更新你的数据库

observer = Observer()
event_handler = MyHandler()
observer.schedule(event_handler, path='/aaa/bbb/ccc', recursive=True)
observer.start()
observer.join()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题