How to tell if a "ZipArchiveEntry" is directory?

Seems like I really do tend to answer my own questions.

Anyway, the answer is straight forward:

If ZipArchiveEntry is a directory it will have its FullName property ending with "/" (e.g. "some_dir/") and its Name property will be empty string ("").

If only someone cared to put that info in the documentation ...

Oh, and there is a catch:
If a directory contains files, there does not have to be a separate ZipArchiveEntry for it.
So, if you are looking for a specific directory you cannot just look for one ZipArchiveEntry with empty Name or with "/" at the end of FullName - you have to parse the whole tree (FullName for each ZipArchiveEntry).

Luckily I had only to check if there is a single common directory for all entries (FullName properties of all ZipArchiveEntry items shoud start with the same string in the form of "folder_name/").


Old question but I think it has a better solution than the one provided here. ZipArchiveEntry has a property named ExternalAttributes. Looks like this has been available since .Net Framework 4.7.2

According to MS docs "...low order byte is the MS-DOS directory attribute byte...".

Therefore all you need to do is to take the low byte, cast it as FileAttributes and check the attributes if it is a "Directory" or not.

   var lowerByte = (byte)(atributeValue & 0x00FF);
   var attributes = (FileAttributes)lowerByte;

Now just check the attributes to see if it is a directory (folder)

if (attributes.HasFlag(FileAttributes.Directory)) {...}

ICSharpZipLib does it like this:

    public bool IsDirectory
    {
        get
        {
            int nameLength = name.Length;
            bool result =
                ((nameLength > 0) &&
                ((name[nameLength - 1] == '/') || (name[nameLength - 1] == '\\'))) ||
                HasDosAttributes(16)
                ;
            return result;
        }
    }

    public bool IsFile
    {
        get
        {
            return !IsDirectory && !HasDosAttributes(8);
        }
    }

one could write these as extension methods for ZipArchiveEntry