【问题标题】:Detect if a file has been overwritten (Move and Replace) using C#使用 C# 检测文件是否已被覆盖(移动和替换)
【发布时间】:2014-09-07 02:10:31
【问题描述】:

我目前正在为要在网络服务器上每晚运行的网站编写一些后台进程。

我的主要问题是我需要检测图像文件在过去 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 小时内真正被修改(编辑、复制、删除然后替换)?

任何帮助将不胜感激。

【问题讨论】:

  • 使用GetCreationTimeUtc() 来处理Cut & Paste。
  • 如果您将文件粘贴到的目录已经有一个同名文件,这将不会检测到剪切和粘贴。如果您使用“移动和替换”选项,则创建时间不会改变。
  • 如果您可以接受标记文件的方法,则可以使用 NTFS 备用数据流(它就像文件本身中的隐藏标志,不能在新文件中)
  • @Xaruth - 真的很有趣,正如我读到的那样,如果文件被复制到某个地方,几天前编辑过,然后移回该目录,备用数据流将保持存在。
  • @RobChurch 是的。但是您可以在午夜检查文件是否具有“标志”(如果不是 = 新文件),并且该标志是否来自前一晚(之前已标记 24 小时),则使用新日期更新标志。这只是一个例子。所以更多是可能的:)

标签: c# windows file filesystems


【解决方案1】:

如果您没有使用存档文件属性的其他软件,则可以根据需要使用它 - 一旦您将文件复制到另一个位置,请取消设置存档属性。从另一个目录覆盖文件将重置它!

// 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);

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

【讨论】:

  • 这是我研究的第一件事,不幸的是它没有用。在我尝试过的系统中,似乎所有图像都默认存档。
  • @jezzipin 如果您的意思是所有文件的位都未设置,则必须使用其他属性(因为这是一种奇怪的方式 - Windows 会在您更改文件时自动设置位,您有如果您已获取副本,请取消设置)。也许您可以禁用该软件或将其设置为在您的例行程序之后立即运行?
【解决方案2】:

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

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

这有一个额外的好处,即使某些问题意味着您的“家务”不会在一夜之间运行,这将不可避免地发生!

【讨论】:

  • 这似乎是迄今为止最好的答案。我已经使用不同的场景彻底测试了这种方法,它似乎万无一失(几乎)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多