用于在用户导入时处理重复文件名的模式?

时间:2017-03-11 03:03:30

标签: javascript design-patterns electron

我正在Electron中开发一个演示样式应用程序(例如Powerpoint,Keynote),用户可以将其图像文件导入项目文件夹,我想知道如何处理潜在文件名冲突的问题。

我不想重新发明轮子:这种东西是否有架构,设计模式或框架?例如,在OSX上,iPhoto使用日期,导入时间以及看似随机(?)的ID来组织导入的图像。

我将实现这是Javascript,但我主要感兴趣的是如何解决问题所以语言并不重要。

iPhoto图书馆:

enter image description here

1 个答案:

答案 0 :(得分:0)

我知道有两种方法:

唯一文件夹名称

通过将每个文件放在具有唯一名称的文件夹中,您可以保留原始文件名并避免任何冲突。如果要将关联文件(例如图像缩略图)与原始文件一起存储,此方法将使您更容易。

您可以使用UUID生成唯一的文件夹名称,这是一个几乎保证不会发生冲突的字符串。有很多Node.js库可以生成UUID,例如uuid。或者只使用任意随机字符串并检查文件夹是否已存在以确定。

或者,如您给出的示例,可以根据日期和时间生成文件夹名称,但您必须确保在一个时间点只添加一个项目,或者在日期下添加随机文件夹与iPhoto示例中一样。当iPhoto使用随机字符串作为文件夹名称时,可能不需要iPhoto中的日期文件夹,但它们会使手动浏览文件夹的用户友好,如果iPhoto需要目录列表,则可能会有性能优势特定日期。

您需要存储对文件夹名称和文件名的引用才能加载文件,但当然这可能是一个字符串,例如"6c84fb90-12c4-11e1-840d-7b25c5ee775a/image.jpg"

唯一文件名

另一种技术是在发生碰撞时将文件重命名为具有唯一名称。这是macOS Finder在您创建新文件夹或复制文件时使用的方法。如果用户可以直接与文件交互,这种方法通常是最好的,因为他们不必浏览具有无意义名称的文件夹。

举个简单的例子,假设我正在添加企鹅的照片,我已经添加了一张名为penguin.jpg的照片。

现在我添加第二张照片,恰好也称为penguin.jpg

  1. 检查penguin.jpg是否存在。它确实如此......
  2. 为文件penguin-2.jpg
  3. 生成新名称
  4. 检查penguin-2.jpg是否存在。它没有,所以......
  5. 将新文件另存为penguin-2.jpg
  6. 如果我添加更多名为penguin.jpg的文件,程序需要不断增加名称,直到找到一个不存在的文件(例如penguin-3.jpg)。除非添加数千个具有相同名称的文件(这似乎不太可能),否则这不会导致任何性能问题。

    我找到了一个N​​ode.js模块,可以为您处理这种方法:uniquefilename