Filesystems 更新平面文件列表的最有效方法

Filesystems 更新平面文件列表的最有效方法,filesystems,Filesystems,我有一个数据库,其中每个条目都有一个文件路径和最后修改的字段: 1284581625555 C:\docs\text1.txt 1284581646992 C:\docs\text2.txt 1284581654886 C:\docs\text3.txt 1284581662927 C:\docs\subfolder\text4.txt 1284581671986 C:\docs\subfolder\text5.txt ... 每个条目还具有文件内容的摘要,这些条目是通过递归地遍历某

我有一个数据库,其中每个条目都有一个文件路径和最后修改的字段:

1284581625555  C:\docs\text1.txt
1284581646992  C:\docs\text2.txt
1284581654886  C:\docs\text3.txt
1284581662927  C:\docs\subfolder\text4.txt
1284581671986  C:\docs\subfolder\text5.txt
...
每个条目还具有文件内容的摘要,这些条目是通过递归地遍历某个文件夹(在本例中为C:\docs)并添加所有访问过的文件创建的。现在我想更新数据库,即

  • 添加新创建的文件
  • 删除已删除的文件
  • 更新修改过的文件
显然,我必须再次遍历根文件夹以查看发生了什么变化。但最有效的方法是什么

我可以想到两种方法:

  • 首先遍历数据库,删除所有已删除的条目并更新所有已修改的条目。为此,每次都必须从存储的路径字符串创建文件对象,并调用file.exists()或file.isModified()。然后递归地遍历根文件夹,添加数据库中还没有的文件
  • 首先沿着文件树往下走,并在列表中记住已添加/删除/修改的内容——这需要存储文件树以前状态的完整快照。然后根据先前创建的列表遍历数据库并添加/删除/修改条目
哪种方法更好?还有别的吗


编辑:创建摘要非常昂贵(全文提取),遍历数据库也有点昂贵,因为它是基于文件的。

我认为最简单的方法是删除并重新创建文件。根据创建“摘要”的难度,这可能是最快的方法,因为您不需要比较或编辑任何内容

如果摘要创建“困难”,并且数据库适合内存,最简单的方法可能是将数据库加载到dict(键入文件名,用数据指示文件是否已“看到”)中,然后再次执行os.walk,根据需要更新dict。然后迭代dict,写入所有已看到的条目


(顺便说一句,上次修改的字段不一定有用,您必须检查文件的修改时间,因此不妨将其与数据库的时间戳进行比较。)

我认为最简单的方法是删除并重新创建文件。根据创建“摘要”的难度,这可能是最快的方法,因为您不需要比较或编辑任何内容

如果摘要创建“困难”,并且数据库适合内存,最简单的方法可能是将数据库加载到dict(键入文件名,用数据指示文件是否已“看到”)中,然后再次执行os.walk,根据需要更新dict。然后迭代dict,写入所有已看到的条目


(顺便说一句,上次修改的字段不一定有用,您必须检查文件的修改时间,因此最好将其与数据库的时间戳进行比较。)

处理此问题的最佳方法可能是重新遍历整个树。这样,您就不用一直调用File.exist(),而只需为每个目录调用一次Directory.list()。这样可以节省文件IO调用,这很可能是这种情况下的瓶颈

获得当前现有文件的列表后,可以比较这两个列表,并确定每个文件的:

  • 新文件
  • 删除的文件
  • 更改文件

并相应地进行操作。

处理这一问题的最佳方法可能是重新完整地行走这棵树。这样,您就不用一直调用File.exist(),而只需为每个目录调用一次Directory.list()。这样可以节省文件IO调用,这很可能是这种情况下的瓶颈

获得当前现有文件的列表后,可以比较这两个列表,并确定每个文件的:

  • 新文件
  • 删除的文件
  • 更改文件
并据此进行