0

我正在开发一个文件管理系统,如果存在同名文件,我想包括一个自动版本控制,例如贝茨编号。我想在文件名和扩展名之间插入一个“-v0001”,并计算它们进来的版本数。

$basename = pathinfo($filename, PATHINFO_BASENAME);
$fname = pathinfo($filename, PATHINFO_FILENAME);

 while (filenameExists($basename)) {
     //look for existing -vnnnn (at end of file name)
     if (versioningExists($fname)) {       
         //roll number ahead, set bates number
     } else {
         //start bates numbering at 1    
     }
     //insert bates version number (str_pad)
 }

我想我会使用正则表达式模式来检查版本控制是否存在。

我的问题是:

  • 使用这样的编号系统有哪些潜在问题?
  • 处理文件名版本控制有哪些替代方法?

我打算将它作为一个大规模导入系统,所以如果我不需要,我不想让用户给我唯一的文件名,而且我确实可以选择包括其他版本控制方案的选择。我的系统有标签,所以文件名的重要性降低了,但我认为仍然有一些重要性。

4

2 回答 2

1

过去,我总是在文件扩展名之前添加 mktime() 的结果(当系统上已经存在所述文件名时)。无需解析当前版本号,您还可以在文件名中添加一个不错的时间戳,这样您就可以知道哪个最先出现以及它是何时创建的。如果您担心其他人可能会在服务器上的同一秒内保存相同的命名文件,您可以在保存之前检查包含时间戳的文件。如果这确实是一个问题,您可能也应该对您的系统做同样的事情,增加数字,然后再次检查是否已经存在具有该名称的文件。

时间戳还有一个额外的好处,即不太可能有人上传已命名为与您的版本号类似的文件,例如,与 bob_1.jpg 相比,bob_321235678.jpg。

所有这一切的一个缺点是您最终可能会得到一堆或多或少相同但名称不同的文件,因此您可能希望定期解析该数据以查找系统中未使用的文件。

于 2009-08-24T18:35:54.180 回答
0

替代方法
我可以建议探索一个真正的版本控制系统作为一个透明后端的颠覆吗?你可以使用 svn 钩子来自动化提交等等。也许这会更简单,更健壮。

subversion doc 上的“Autoversioning”一章可能是一个很好的起点。

于 2009-08-24T16:16:53.070 回答