0

我正在创建一个程序,该程序在过去 24 小时内扫描给定目录中的所有文件及其所有子目录中的更改,而不是创建或删除。我已经看过很多其他示例/教程,但并非所有示例/教程都符合我的要求。

到目前为止,这是我的代码:

using System.IO;

public static void Main(string[] args)
{
    string myDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), @"C:\Path");
    var directory = new DirectoryInfo(myDirectory);
    DateTime from_date = DateTime.Now.AddDays(-1);
    DateTime to_date = DateTime.Now;
    var files = directory.GetFiles()
                         .Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date)
                         .ToArray();

    Console.WriteLine();
}

问题是上面的代码只告诉我目录中的最后一次更改。我想要的是目录中所有更改的日志。

我是一个学习的学生,所以很多解释会很棒!:)

我不是,我再说一遍,不是,寻找 FileSystemWatcher,我不希望我的服务器连续 24 小时运行。我想每 24 小时启动一次这个程序,做一个日志,关闭它。如果有人可以帮助我解决这个问题,或者至少给我一些开始,我将非常感激!

编辑

我最终的目标是通过另一个代码工作,一个完全不同的代码。我要感谢大家帮助我并提高我对一些事情的理解

4

4 回答 4

0

正如其他人已经写的那样:如果没有文件系统观察程序或存储文件列表,您就没有机会检测到已删除的文件。也可以更改文件日期(但是,我不知道是否可以更改上次写入时间或仅创建时间)。此外,重命名文件通常不会更改任何文件日期。

问题是上面的代码只告诉我目录中的最后一次更改

我在 VS 2010 中测试了您的代码,在调试器中我看到变量文件中有多个条目。也许您在目录本身中只有一个修改过的文件,而在子目录中只有一个修改过的文件(参见 belov)?也许你的输出是错误的?如果目录中确实有多个最近更改的文件,我建议使用附加变量来获取中间结果以检查错误发生的位置。(directory.GetFiles() 是否给你一个不完整的文件列表或者过滤器在哪里有问题?)

最后但同样重要的是,你写

和他所有的子目录

根据 MSDN GetFiles 仅返回当前目录中的文件。如果您还想要子目录,则必须递归到它们。当然你应该在添加递归之前解决文件列表不完整的问题。

希望有帮助

于 2013-09-19T12:50:24.940 回答
0

这不可能。文件都没有更改日志,操作系统也没有写入此类日志。只有您可以获得的信息是最后一次写入时间。如果您需要完整的日志,那么您应该手动创建它(例如使用创建 Windows 服务FileSystemWatcher),或者您可以考虑使用一些版本控制系统,它会跟踪对文件的所有更改(在这种情况下,对文件的更改应该通过版本控制来完成)软件)。

于 2013-09-19T12:21:01.277 回答
0

根据您的需要,这可能(据我所知)甚至无法在 .NET 中干净地完成 - 您真正想要的可以使用File System Minifilter Driver来完成,它在内核空间中安静地运行并且可以拦截特定文件路径(例如 C:\Sub*)内的所有IRP 数据包。可以使用fltmc.exe 命令加载此类程序。

于 2013-09-19T12:58:28.940 回答
0

如果没有 a FileSystemWatcher,您将必须有一个用于比较差异的外部文件。

所以在第一次运行时你会得到

文件 1
文件 2
文件 3

没有变化!

下一次运行你可能会得到

文件 1
文件 3
文件 4

并且您将能够比较第一个列表以显示文件 2 丢失并且文件 4 是新的...

于 2013-09-19T12:22:56.237 回答