2010-09-15 47 views
0

我在那里的每一项都有一个文件路径和最后一次修改数据库字段中:最有效的方式来更新平面文件列表

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()。然后递归地遍历根文件夹并添加不在数据库中的文件。
  • 首先走下文件树,记住列表中已添加/删除/修改的内容---这需要存储文件树以前状态的完整快照。然后遍历数据库并根据先前创建的列表添加/删除/修改条目。

哪种方法更好?还有其他吗?

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

回答

2

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

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

(顺便说一句的最后修改字段不一定有用,你无论如何都要检查文件的修改时间,所以可能它也比较数据库的时间戳。)

1

大概来处理这是最好的方式重新整体重新走树。这样,不是一直调用File.exist(),而只是每个目录调用一次Directory.list()。这为您节省了文件IO调用,这很可能是这种情况下的瓶颈。

一旦你拥有了当前存在的文件列表,你可以比较两个列表,并确定每个文件:

  • 新文件
  • 删除的文件
  • 修改过的文件

并据此进行。