文件创建日期时间,以便为不同的文件和时间复制

时间:2009-11-06 19:42:56

标签: c# datetime filesystems timestamp

我编写了一项服务,用于监控扫描程序中文件的文件放置位置。扫描程序删除具有完全相同文件名的所有文件(例如,Test.tif),除非该文件已经存在,然后它附加在结尾的时间戳上(例如,Test_0809200915301900.tif)。

因此,当我处理这些文件时,我将一个“标记”附加到数据库条目以反映此特定文件,即文件名加上文本创建时间戳的刻度。每个扫描仪最多可以每隔几秒钟产生1次扫描,因此精确到第二次就足够了。

以下是生成这个唯一标记的代码:

FileInfo fileInfo = new FileInfo(filePath);
string tag = string.Format("{0}_{1}", filename,
  fileInfo.CreationTimeUtc.Ticks.ToString());

生成的代码类似于:Test1.tif_633931295923017954

出于某种原因,虽然当一堆扫描从同一个扫描仪进来时说在20秒的过程中(例如1次扫描,然后是5秒后的另一次扫描,然后是5秒后的另一次扫描等),它们正在得到确切的结果。相同的文件创建时间戳。

例如

  1. 档案:Test1.tif
  2. 选择并与标记Test1.tif_633931295923017954
  3. 一起存储
  4. Test1.tif已删除。
  5. 文件输入:Test1.tif(5秒钟后)
  6. 已启用且未能存储,因为生成的代码与Test1.tif_633931295923017954
  7. 重复

    这怎么可能?刻度相同。我检查了创建时间对象,尽管我实际看到它在第一个对象后5秒创建,但它也完全相同。

    编辑:有人可以推荐一个解决方案来确保我处理一个独特的文件吗?我认为文件名+创建时间戳应该是一个足够好的检查,但显然它不是。我没有能力关闭Windows正在执行的“隧道”功能。

    编辑:我最终让该进程重命名每个文件并附加一个guid。然后处理文件的进程只查找附加了guid的文件。这确保只处理了唯一的文件。

2 个答案:

答案 0 :(得分:4)

这是Windows的一个名为File System Tunneling的功能,是预期的行为。本质上,这是一个操作系统,用于处理用户编辑和保存文件时删除文件并写入新文件的软件。用户希望编辑文件的文件创建时间与原始文件相同,并且软件可能要求在编辑之前和之后文件名的“短”版本保持不变,以便Windows伪造它。

有关详情,请参阅:The apocryphal history of file system tunnelling了解详情。

修改 我很惊讶FileSystemInfo.LastWriteTime因为Feaderne建议不起作用。 您能否按原样离开File1.tif并注意使用FileSystemWatcher在目录中创建唯一文件,模式匹配新创建的文件,并使用您的命名方案复制它们?

答案 1 :(得分:0)

LastWriteTime会给你你想要的时间戳吗?