我编写了一项服务,用于监控扫描程序中文件的文件放置位置。扫描程序删除具有完全相同文件名的所有文件(例如,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秒后的另一次扫描等),它们正在得到确切的结果。相同的文件创建时间戳。
例如
Test1.tif_633931295923017954
Test1.tif_633931295923017954
这怎么可能?刻度相同。我检查了创建时间对象,尽管我实际看到它在第一个对象后5秒创建,但它也完全相同。
编辑:有人可以推荐一个解决方案来确保我处理一个独特的文件吗?我认为文件名+创建时间戳应该是一个足够好的检查,但显然它不是。我没有能力关闭Windows正在执行的“隧道”功能。
编辑:我最终让该进程重命名每个文件并附加一个guid。然后处理文件的进程只查找附加了guid的文件。这确保只处理了唯一的文件。
答案 0 :(得分:4)
这是Windows的一个名为File System Tunneling的功能,是预期的行为。本质上,这是一个操作系统,用于处理用户编辑和保存文件时删除文件并写入新文件的软件。用户希望编辑文件的文件创建时间与原始文件相同,并且软件可能要求在编辑之前和之后文件名的“短”版本保持不变,以便Windows伪造它。
有关详情,请参阅:The apocryphal history of file system tunnelling了解详情。
修改强>
我很惊讶FileSystemInfo.LastWriteTime
因为Feaderne建议不起作用。
您能否按原样离开File1.tif
并注意使用FileSystemWatcher
在目录中创建唯一文件,模式匹配新创建的文件,并使用您的命名方案复制它们?
答案 1 :(得分:0)
LastWriteTime
会给你你想要的时间戳吗?