首页 > 解决方案 > 关于如何在尝试/捕获异常后忽略 for 循环中的文件的任何建议?

问题描述

我确实想就这个特定问题征求建议。现在我有这个自定义文件观察器,它只是观察一个文件夹并检测是否有任何 .json 文件并将它们反序列化。但是,它有可能读取无效的并抛出异常。我面临的问题是,因为它是一个在 3 秒内重复调用的服务,它会继续读取无效文件并用不成功的反序列化尝试填充日志。

我正在寻找解决此问题的建议,并希望在这里寻求建议。

我最初的想法是在捕获到异常后立即执行 File.Copy 并将其移动到另一个位置,以便服务无法监视它。但仔细想想,我认为如果服务能够识别无效文件并且在监视其他文件的同时不对所述文件执行操作会更好。

这是代码片段:

IENumerable<FileInfo> filesInDirectory = DirectoryInfo.GetFiles();

try {

    if(filesInDirectory.Any())
    {

        foreach(var file in filesInDirectory) 
        {

            if(file.Extension == ".json")
            {
                Logger("The file " + file.Name + " is being deserialized.");
                  //The file is read here for its contents and deserialized
            }

        }

        Logger("The file has been deserialized at " + DateTime.Now());

    }

catch 
{

//Exception handled here. Initially it was File.Copy and File.Delete(file.FullName);
}

我的想法实际上是在var file自身上放置一个布尔值,在 .json 条件满足时将其标记为已读,如果它抛出异常,则将其设置为 true 并被忽略。但是,我认为我无法将属性附加到FileInfo该类,因为它是一个 System 类。

如果反序列化完成,文件将从目录中删除,但如果无效文件保留在目录中;这Logger是我编写的一个自定义函数,通过将消息输出到文本文件来记录服务的操作,日志文本文件将显示它一直递归地尝试反序列化无效的 json 文件,只要它保留在文件夹中。

用户可能会不小心将未映射到Foo对象的 .json 文件放入其中,而我不想触摸该文件,只需跳过它即可。

这是我认为超出了我的家庭作业范围的事情,但我想知道这个想法是否可行或可实施,我真的很想看到任何关于此的建议或建议。

标签: c#json

解决方案


我最初的想法是在捕获到异常后立即执行 File.Copy 并将其移动到另一个位置,以便服务无法监视它。但仔细想想,我认为如果服务能够识别无效文件并且在监视其他文件的同时不对所述文件执行操作会更好。

在消息队列处理中是否为MSMQ;联合管理系统;阿帕奇;网络;有一个消息的概念,在一定次数的重试失败后,如果无法处理该项目,则将其视为有害消息并移至有害消息队列以供操作部门稍后进行调查。

您可以将相同的概念应用于文件处理。如果在尝试后您无法处理它,或者是因为它是一个格式错误的文件;一个文件,报告它是一个 JSON 文件,但实际上是 Miss Piggy 的 JPEG,错误地命名为 kermit.JSON;将其移至Poison File 文件夹。

不能仅仅因为某事声称是某种类型就认为它说的是真话。换句话说:

  • 不要相信文件扩展名
  • 不要相信文件大小
  • 不要假设你可以打开文件进行阅读(它可以被 NTFS 加密)
  • 建造一个 rety 设施。仅仅因为它第一次失败,并不意味着它会失败第二次。(也许该文件只是被诸如防病毒之类的东西打开)

推荐阅读