我有一个情况。我想根据他们上次修改时间的创建来阅读文件。最初我使用了FileSystemWatcher,以便在新文件到来时通知我,但后来我意识到如果运行我的软件的系统出现故障或重新启动文件被丢弃的位置仍将继续。
为了便于理解,我将举例:
系统A - 文件服务器(在此服务器上的目录中每2分钟创建一次文件) 系统B - 我的软件将运行并监视系统A的路径中的文件
如果系统B重新启动并在10分钟后再次启动,FileSystemWatcher将跳过在这10分钟内生成的所有这些文件。
如何确保在10分钟内生成的文件也被捕获?
如果我的问题仍然不可理解,请告诉我。
答案 0 :(得分:0)
我会将此应用程序拆分为两部分并运行filesystemwatcher-wcf服务,该服务缓冲在此10分钟内创建的文件,并在重新启动时将其发送到系统b。抱歉,我看不到另一种方式。
答案 1 :(得分:0)
如果您不想在两个系统中将其拆分,则必须保留一些信息。 每次在文件系统观察程序上触发新事件时,您都可以将当前时间戳存储在文件中。每次启动服务时,您都可以从文件系统中读取比上一个时间戳更新的所有文件。这样你就不会错过任何文件。
答案 2 :(得分:0)
从源计算机复制整个文件,并根据条件粘贴到目标位置。
string dirPath = @“C:\ A”; 字符串DestinPath = @“C:\ B”;
if (Directory.Exists(dirPath) && Directory.Exists(DestinPath))
{
DirectoryInfo di = new DirectoryInfo(dirPath);
foreach (var file in di.GetFiles())
{
string destinFile = DestinPath + "\\" + file.Name;
if (File.Exists(destinFile))
{
continue;
}
else
file.CopyTo(destinFile);
}
}
答案 3 :(得分:0)
我认为FileSystemWatcher必须将有关文件系统的信息写入DB(或其他类型的存储)。当系统B启动时,观察者会将当前文件系统与此信息进行比较,并将引发有关更改的事件。
答案 4 :(得分:0)
不确定我是否正确理解了您的问题,但是根据我得到的结果并假设两个系统在时间上是同步的,例如,如果您想要获取在十分钟前修改过的文件:
DateTime tenMinutesAgo = DateTime.Now.AddMinutes(-10);
string[] systemAFiles = System.IO.Directory.GetFiles(systemAPath);
foreach (string files in systemAFiles)
{
DateTime lastWriteTime = System.IO.File.GetLastWriteTime(files);
if (lastWriteTime > tenMinutesAgo) //produced after ten minutes ago
{
//read file
}
}
我知道这些文件是“生成的”,因此它们已被创建或修改。如果他们只是从一个文件夹移动到另一个文件夹,这将无法正常工作。在这种情况下,最好的方法是编写该列表中文件的快照(并将其写入某种保存文件),并在它再次运行时进行比较。