C# 跨不同路径使用元数据标识文件

C# 跨不同路径使用元数据标识文件,c#,windows,file-io,C#,Windows,File Io,我有一个win服务将文件“a.txt”写入文件夹“Input”。 从这里,另一个第三方服务将仔细阅读该文件,并在修改后将其放回文件夹“Output”。 使用文件名“a.txt”,我可以确定输入中的文件已被处理并收到bny输出 我的问题是,即使在我等待处理后的副本返回到“输出”时,同一文件的更新版本也可能被写入“输入”。 所以在这种情况下,当我在“Output”中找到“a.txt”时,如何确定它是原始文件的哪个版本? 我尝试使用FileInfo.CreationTimeUtc属性,但“输出”的情况

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

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

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

  • 读取输入文件及其CreationTimeUtc
  • 写入名为a-CreationTimeUtc.txt的输出文件
  • 编辑
    正如您所说,您不能更改文件名,第二个选项是将日期和时间写入文件本身。

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

    如果您不控制第三方工具,则需要控制您唯一能控制的东西——您编写的文件。如果对“a.txt”的写入改为对“a.timestamp.txt”的写入,则可以查看已处理的版本

    正如您所说,您不能更改文件名,您有以下选项

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

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

    您可以监视目录,并使用修改后的文件名将输入中的文件存储在第二个目录中(如果您确实无法使用同一目录)

  • 输入中存储的第三方文件:a.txt
  • 程序识别a.txt并将其复制到Input/Queue/a.Timestamp.txt中
  • 您的程序将处理每个文件并将其复制到输出
    如果不能在输出目录中使用时间戳,则必须等到输出中的文件也被处理后,才能覆盖它。我在generell中看到的问题是,文件a.txt上是否没有锁或类似的东西。a、 txt可以写入两次,第一个版本根本不会被处理。如前所述。最好是使用某种非基于文件的队列或输入中更为唯一的名称。即使您无法直接控制第三方服务,这也可能是一个大问题……

    不幸的是,我没有这个选择。文件名遵循一种特定的格式。那么可能是文件内容本身?是的,应该可以,谢谢。我看到的唯一问题是,由于要处理的文件数量很大,因此必须阅读每个文件的内容才能做出此决定。是的,但如果您无法更改名称,您可能没有更好的选择。我编辑了答案,顺便说一句。不,没有控制,这就是为什么我特别称它为“第三方”。:)谢谢,当一个人控制双方时,这是一个很好的选择。谢谢,必须保持文件名格式,所以不能这样做。@shashankss,你如何保证原子性和顺序?也就是说,如果您编写
    Input/a.txt
    ,您将开始生成
    Output/a.txt
    。但是如果第二次写入
    Input/a.txt
    ,您将再次生成
    Output/a.txt
    。如果没有进一步的信息,第一个处理步骤似乎可以读取原始文件和更新的混合,或者第二个处理步骤可以在第一个完成之前完成。在我看来,这个处理管道的描述方式很快。您可能想看看设计方法——在您有机会处理它之前,是否存在第三方覆盖输出/a.txt的风险?