【问题标题】:Pitfalls of automated file versioning?自动文件版本控制的陷阱?
【发布时间】:2010-11-22 08:03:54
【问题描述】:

我正在开发一个文件管理系统,如果存在同名文件,我希望包含一个自动版本控制,例如 bates numbering。我想在文件名和扩展名之间插入一个“-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)
 }

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

我的问题是:

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

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

【问题讨论】:

  • 我忘了提到我只是将文件名作为指向文件系统中完全唯一文件名的数据库指针来处理。如果我愿意,我可以使用相同的文件名,我只是觉得这会让前端用户更加困惑。

标签: php regex version-control filenames file-management


【解决方案1】:

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

"Autoversioning" chapter on the subversion 文档可能是一个很好的起点。

【讨论】:

  • 我只是对文件名进行版本控制。这种方法可能有利于文档的版本控制,但我需要将文件的所有版本呈现为唯一文件。我想我的意思是我进行版本控制的原因是不显眼地禁止相同的文件名冲突,而不一定要严格控制同一文档的版本。
  • 啊,好吧,我错过了你的真正目标。对不起
  • @Brad Gilbert,感谢您的英语语法课。顺便说一句,拼写检查器不喜欢“健壮”:)
【解决方案2】:

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

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

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

【讨论】:

  • 很好的解决方案。但我会使用 ISO 8610 日期格式对其进行改进,因为它具有许多优点(例如排序能力)。请参阅en.wikipedia.org/wiki/ISO_8601 以获取参考及其优势的简要说明,以及与其他标准格式的比较。
猜你喜欢
  • 1970-01-01
  • 2014-08-11
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多