【问题标题】:Identifying file using metadata across different paths使用跨不同路径的元数据识别文件
【发布时间】:2011-11-09 11:41:00
【问题描述】:

我有一个 Win 服务将文件“a.txt”写入文件夹“Input”。 从这里,另一个第三方服务会仔细阅读该文件,并在修改后将其放回文件夹“输出”中。 使用文件名“a.txt”,我可以确定放在 Input 中的文件已经被处理并接收到 bny Output。

我的问题是,即使我等待处理后的副本返回到“输出”,同一文件的更新版本也可能被写入“输入”。 那么在这种情况下,当我在“输出”中找到“a.txt”时,如何确定它是原始文件的哪个版本? 我尝试使用 FileInfo.CreationTimeUtc 属性,但“输出”会发生变化。 有什么建议吗?

【问题讨论】:

  • 您可能想看看设计方法——在您有机会处理它之前,是否存在第三方覆盖 output/a.txt 的风险?

标签: c# windows file-io


【解决方案1】:

您是否可以控制将 a.txt 写入输出的第三方服务?如果是这样,则 FileInfo.CreationTimeUtc 既可读取又可写入。将文件放入输出后,它可以从处理的文件中获取创建时间,并将其设置在输出中的文件上。

【讨论】:

  • 不,没有控制权,这就是为什么我专门称它为“第三方”。 :) 不过谢谢,当一个人确实控制双方时,这是一个不错的选择。
【解决方案2】:

如果您不控制第三方工具,您需要控制唯一可以控制的东西——您编写的文件。如果写入“a.txt”而不是写入“a.timestamp.txt”,您可以看到哪些版本已被处理。

【讨论】:

  • 谢谢,必须保持文件名格式,所以不能这样做。
  • @shashankss,你们如何保证原子性和有序性?也就是说,如果您编写Input/a.txt,您将开始生成Output/a.txt。但如果第二次写入Input/a.txt,您将再次生成Output/a.txt。如果没有进一步的信息,似乎第一个处理步骤可以读取原始文件和更新的混合,或者第二个处理步骤可以在第一个完成之前完成。这个处理管道的描述方式对我来说很刺激。
【解决方案3】:

也许您可以在输出文件名中添加日期和时间。

  1. 读取输入文件及其 CreationTimeUtc
  2. 写入名为 a-CreationTimeUtc.txt 的输出文件

编辑

正如您所说,您不能更改文件名,第二个选项是将日期和时间写入文件本身。

【讨论】:

  • 不幸的是,我没有那个选项。文件名遵循特定格式。
  • 那么可能是文件内容本身?
  • 是的,应该可以,谢谢。我看到的唯一问题是,要处理大量文件,必须读取每个文件的内容才能做出此决定。
  • 是的,但如果您无法更改名称,您可能没有更好的选择。顺便说一句,我已经编辑了答案。
【解决方案4】:

正如您所说,您无法更改文件的名称,您有以下选项

  • 如果第 3 方“服务”支持,每个文件使用一个子目录

或

  • 为每个文件名维护一个“队列”
    每当您生成文件时,您都会在临时文件夹中使用唯一名称存储它 - 而不是使用“真实”名称(根据您的命名约定)......您维护一个集合(具有“真实”名称的字典 => 唯一的队列名称)和“WorkItem”-List...然后您将一个唯一名称移动到具有“真实”名称的“Input”文件夹中,并将该名称添加到您的“WorkItem”-List...当该文件出现在您的“输出”文件夹,然后将其从“工作项”列表中删除,并将其从字典中的队列中出列……“移动到输入文件夹”总是首先检查“真实”名称是否已经在“工作项”中-List,如果是,它不会移动它。

【讨论】:

    【解决方案5】:

    您可以监视目录并将放置在 Input 中的文件存储在第二个目录中(如果您真的不能使用相同的目录),并使用修改后的文件名。

    1. 第三方存储在 Input:a.txt 中的文件
    2. 您的程序识别 a.txt 并将其复制到 Input/Queue/a.Timestamp.txt
    3. 您的程序将处理每个文件并将其复制到输出。

    如果您不能在输出目录中使用时间戳,您将不得不等到来自输出的文件也被处理,这样您就不会覆盖它。我在generell中看到的问题是文件a.txt上是否没有锁或类似的东西。 a.txt 可以写两次,第一个版本根本不会被处理。就像已经说过的那样。更好的是某种非基于文件的队列或输入中的更多唯一名称。即使您没有直接控制第三方服务,这也可能是一个大问题...

    【讨论】:

      猜你喜欢
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多