Проверка файлов / архивов на соответствие базе данных - правильные ли производные классы? - PullRequest
0 голосов
/ 26 мая 2020

Я бы хотел проверить файлы или записи внутри архивов (zip, 7z, ...) по базе данных с помощью Crc32. Если файлы неизвестны, удалите их. Если файлы необходимо переименовать, переименуйте их и так далее ...

это структура, которую я реализовал до сих пор:

public class FileBase
{
    public FileBase() { }

    public string FullName { get; set; }
    public string Name => Path.GetFileName(FullName);
    public string FileNameWithoutExtension => Path.GetFileNameWithoutExtension(FullName);
    public string DirectoryName => Path.GetDirectoryName(FullName);
    public string Extension => Path.GetExtension(FullName);
    public string Crc { get; set; }
    public DateTime? LastWriteTime { get; set; }
}

public class FileModel : FileBase
{
    public FileModel() { }

    public void MoveTo(string target)
    public void Delete()
}

public class ArchiveModel : FileModel
{
    public ArchiveModel() { }

    public HashSet<ArchiveFileModel> Entries{ get; private set; }

    public Dictionary<string, Stream> Extract(List<ArchiveFileModel> entries)
    public void Compress(Dictionary<string, Stream> fileStreams)
    public void Modify(ArchiveInfoFile entry, string targetName)
}

public class ArchiveFileModel : FileBase
{
    public ArchiveFileModel() { }

    public int Index { get; set; }
    public ArchiveModel Parent { get; set; }
}

Теперь я создаю список типа FileBase который содержит FileModels или ArchiveModels (в зависимости от расширения файла) до l oop, хотя каждый файл и проверяется на соответствие базе данных.

Нижняя часть этого, для каждого необходимого действия (MoveTo, Delete, Extract, Compress, Modify) Мне нужно преобразовать объекты базового класса в объекты производного класса (что я считаю плохой практикой):

var fileList = new List<FileBase>;
.
.
.
foreach (file in fileList)
{
    If (file is ArchiveFileModel)
    {
        var archive = file as ArchiveFileModel;
        archive.Compress(....
        ...
    }
}

и так далее ....

Есть ли у кого-нибудь другие идеи для решить этот прецедент?

...