/// <summary>
        /// Reads the next file.
        /// </summary>
        /// <param name="tarEntry">The read entry (null if no more entries available).</param>
        /// <param name="content">The read content (null if no more entries available).</param>
        /// <param name="callback">The callback used during stream copy.</param>
        /// <param name="userItem">A user item for the callback.</param>
        /// <returns>Returns true if the operation completed, false if the callback used <see cref="ProgressEventArgs.Break"/>.</returns>
        public bool ReadNext(out TarEntry tarEntry, out byte[] content, ProgressCallback callback = null, object userItem = null)
        {
            if (tarStream == null)
            {
                throw new ObjectDisposedException(nameof(TarReader));
            }

            while ((tarEntry = tarStream.GetNextEntry()) != null)
            {
                if (tarEntry.IsDirectory)
                {
                    continue;
                }

                using (var ms = new MemoryStream())
                {
                    tarStream.CopyEntryContents(ms, callback, userItem);
                    content = ms.ToArray();
                    return(true);
                }
            }

            content = null;
            return(false);
        }