使用C#检测文件是否已被覆盖(移动和替换)

时间:2014-07-16 13:51:46

标签: c# windows file filesystems

我目前正在为网站编写一些后台流程,这些流程将在网络服务器上每晚运行。

我的主要问题是我需要检测图像文件在过去24小时内是否发生了变化。我认为使用以下代码可以轻松实现:

DateTime lastWrite = System.IO.File.GetLastWriteTimeUtc(HttpContext.Current.Server.MapPath(image.FileName));

if (lastWrite > DateTime.UtcNow.AddHours(-24) && lastWrite < DateTime.UtcNow)
{
    var a = "This item has been modified";
}
else
{
    var b = "This item has not been modified";
}

然而,似乎这只会在上次修改文件时给我DateTime。如果使用类似油漆的图像编辑图像但这并不能告诉我图像是否已使用现有图像上的剪切和粘贴覆盖,因为修改后的创建日期与原始图像保持一致到位。

因此,我的问题是如何在24小时内检测文件(主要是图像)是否真正被修改(编辑,复制,删除然后更换)?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

对于这个长时间运行的页面应用程序,您需要保留一个包含有关旧文件的信息的数据库。这样做的一种方法是存储每个文件的MD5,然后比较和复制已更改的内容。

using (var md5 = MD5.Create())
using (var stream = File.OpenRead(filename)) {
    return Convert.ToBase64String(md5.ComputeHash(stream));
}

这有一个额外的好处,即使某些问题意味着您的&#34;内务管理&#34;不会在一夜之间运行,这将不可避免地发生!

答案 1 :(得分:0)

如果您没有使用存档文件属性的其他软件,那么它将按您的需要运行 - 一旦您将文件复制到另一个位置,请取消设置存档属性。覆盖另一个目录中的文件将重置它!

// Check for flag
FileAttributes attributes = File.GetAttributes(path);
bool isArchiveSet = (attributes & File.Archive) == File.Archive

// Remove archive flag
FileAttributes attributes = File.GetAttributes(path);
attributes = attributes & ~FileAttributes.Archive;
File.SetAttributes(path, attributes);

(未经测试的代码,如果您遇到问题请告诉我,我会看一下 - 但我已经测试了存档位的行为,它可以满足您的需求。)