将元数据信息存储在文件名中是不好的做法吗?更好的解决方案?


13

我注意到我在哪里工作,人们热衷于在文件名中存储信息并解析文件名。

对我来说,这似乎不是特别好的做法。我已经看到脚本偶尔会遍历一个文件的问题,并且由于另一个文件首先匹配而出现错误,我们也正在讨论如何解决字段分隔符的问题。

是否被认为是不良做法?

基于某种类型的元数据从文件系统中检索文件的其他公认解决方案是什么?


这很大程度上取决于文件名上存储的内容。你能举一些例子吗?
T. Sar

Answers:


14

是的,我认为这是不好的做法。它会遇到各种各样的问题-例如长度限制,编码问题和由于重复数据而引起的冲突。

更好的方法是使用包含元数据和文件路径的“主文件”(有时称为清单或索引)。或数据库中类似的东西,注册或其他。或者将元数据放在实际文件中,位于文件中某些数据结构的顶层,例如JSON或XML。

这有点类似于在键值存储中放置信息或命名空间的概念。我认为这是可以的,只要您仅将其用于命名空间并进行快速查找-关键组件就无法提供可解析的信息。如果需要该信息,请将其复制到值(上述情况下的文件)中。


3
您正在提高直觉。但是在某些情况下,将信息放入文件名仍然有意义。考虑必须以基于规则的方式路由或处理的邮件附件。如果许多并行进程必须更改主文件,则它可能成为瓶颈。
Axel Kemper 2013年

作为数据库开发人员,我自然会考虑使用数据库而不是清单文件(我在这里要求其他方法的原因之一)。这样可以解决并发访问问题,但这是一个更复杂的解决方案。
wobbily_col 2013年

1
@wobbily_col,取决于您使用的系统,可能会支持扩展的文件属性
Hellion

@AxelKemper名称中只包含这么多信息。元数据比名称和作者更多。
图兰斯·科尔多瓦

更不用说文件名可以由系统外部的人更改,从而破坏任何期望的格式。即使强制实施了适当的文件权限,它最终还是一个脆弱的解决方案。
Berin Loritsch

5

首先,元数据是一个模糊的概念。

也就是说,文件中元数据的许多情况已经存在:

  • 库的版本号
  • 图像的日期和时间,或至少是序列索引
  • 文件类型,触发哪个应用程序应打开文件
  • 主目录的名称,必须是您的会话用户名

尽管如此,这份简短清单并不是赞成这种做法的理由。

替代方法是:

  • 处理FS级别的元数据,例如Apple old HFS
  • 将元数据放入文件本身,例如Exif用于图像或ID3用于声音
  • 像大多数媒体管理器一样,将元数据放在另一个文件或数据库中。

5
一切都是一个模糊的概念。甚至“模糊”,“概念”和“一切”都是模糊的概念。
图兰斯·科尔多瓦

3

听起来您需要数据库。

将用户数据放入文件名中存在很多安全问题。假设您为每个用户都有一个文件(“ username.txt”)。有人注册用户名“ ../../../../etc/passwd”会发生什么情况,取决于您过滤用户输入的方式。

数据库框架有时会帮助您清理用户输入。


实际上,许多操作系统将用户名存储在目录名中,这称为主目录
mouviciel

那是因为某些软件必须位于堆栈的底部。这并不意味着每个人都必须在这个级别上工作。我不会争论数据库的优点,因为程序员使用它们已有50多年了。
Eric Wimberley

1
@mouviciel我不知道有任何操作系统可以从用户的主目录名中解析出该用户名。Windows和类似Unix的系统都将目录的名称存储在某种数据库中,并在用户登录时将其加载到环境中。在这两种系统下,最终的主目录名称都可以与用户名不同(例如重命名用户,或者在同一系统分区上有两个Windows安装)。
Jules

2

不...很好..不一定。

只要您有严格的约定并且可以使用常用的解析和验证手段(脚本,库等),您就可以使用。

以打包和依赖管理系统(Maven,NuGet等)为例。尽管许多人会将特定文件用于元数据来存储更高级的信息,但基本信息通常是文件名本身的一部分。根据严格的约定,文件名可以包含有关软件包的最相关信息:它是供应商,它的名称,它的版本,它的类型。有时候,这就是您所需要的... 4或5条简短的信息。

如果元数据很简单,则文件命名约定非常合理,无需放置任何内容。可以使用非常简单的工具和脚本,不需要数据库,不需要专门的基础结构,只需几个脚本和命名约定来增强它。

如果那里什么也没做,那么您需要什么,而您的需求很简单,我将从这里开始。

您的要求超出了这个约定?用适当的元数据文件扩展它。您以后需要对此进行更好的搜索吗?已经有不错的解决方案来搜索文件,使您到达所需的位置。

并不是我不喜欢数据库,相反,它们确实功能强大且有用,但是它们需要一定的开销才能运行。他们需要安装,备份,维护,您将需要一些工作人员,如果他们不是完全专职的话,则需要将部分时间用于此基础架构。对于外行来说,它们也更复杂,更隐秘,失去了设置您的开发人员,您的系统将被困在及时位置,直到找到替换的设备为止。

切勿过分低估低端技术的力量,适当的监督可能会让您漫漫长路。

而且,当您不再使用低技术含量的解决方案时,您将已经积累了所有经验和要求,可以实施满足您需求的完美系统。


永远不要低估惯性的力量。将低技术含量的解决方案更改为更强大的解决方案要比不从一开始就做更多的工作。
Berin Loritsch '19

1
@BerinLoritsch同样的论点适用于所有解决方案,低端技术或高科技……人们可能会认为,要求更多系统相互依赖的高科技实际上使这种情况变得更糟,而不是更容易。就是说,存在一个门槛,即简单的低技术解决方案比全面发展的高科技解决方案更令人费解。
Newtopian

1
是的,现在我要在一个项目中解开几个这样的例子。最重要的是,确实需要一个比文件系统更紧密的接口,而不是没有。不幸的是,我继承的大多数低技术系统都没有对其应用适当的思想或设计。我可以指望的例外数量。
Berin Loritsch

0

首先,让我们同意文件什么。文件是打包的数据,其名称可以通过(非常接近)原子操作进行发送,接收,创建和删除。

许多文件系统(Mac OS和更新的Linux文件系统)实现了“ forks”,通常用于存储资源和元数据。这种存储元数据的方法存在问题,因为传统的网络传输方法,备份和还原方法以及文件复制方法不一致,尤其是当源文件系统和目标文件系统对文件派生的理解不同时。

文件名用于保存元数据,因为a)始终存在元数据,b)文件名中始终存在元数据(至少在使用文件扩展名的情况下),以及c)移动时文件名很少经过翻译系统之间的区分(区分大小写,字符集限制,字符限制)。

因此,文件名是可见的,可移植的且可管理的。对于存储某些元数据来说,这不是一件坏事。

解决通用文件元数据的最佳解决方案可能是使用内容存储库,其中可以使用要用于文件的元数据架构配置内容存储库。在许多情况下,这是过大的了,但是恕我直言,这是进行认真的元数据管理的方法。


0

我对此的看法是,您可能在某个地方看到了一些代码,这些代码确实使文件名草率或变脆,但这并不意味着“在文件名中存储元数据”通常是不好的。

文件名元数据-它们是有关文件中数据的数据,与文件数据本身无关。实际上,文件名太旧了,以至于它们可能是元数据的典型示例。

如果您认为文件扩展名只是文件名的末尾部分,那么文件名即元数据的概念就变得不可避免。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.