public static IEnumerable <FileDataStream> EnumerateDataStreams(this FileInfo file)
        {
            if (file == null)
            {
                throw new ArgumentNullException(nameof(file));
            }

            // init locals
            var fpath = file.FullName;
            var fsd   = new Interop.FindStreamData();

            AsIntPtr(ref fsd, out var fsdptr);
            var hFindStream = Interop.INVALID_HANDLE_VALUE;

            try
            {
                // check if we can get any stream
                if (!FindFirstStream(fpath, fsdptr, out hFindStream))
                {
                    yield break;
                }

                // Extract stream info
                ExtractStreamInfo(fsd.PtrToString(), out var streamName, out var streamType);
                yield return(new FileDataStream(file, streamName, fsd.StreamSize, streamType));

                // Extract more streams until we run out
                while (FindNextStream(fsdptr, hFindStream))
                {
                    ExtractStreamInfo(fsd.PtrToString(), out streamName, out streamType);
                    yield return(new FileDataStream(file, streamName, fsd.StreamSize, streamType));
                }
            }
            finally
            {
                if (hFindStream != Interop.INVALID_HANDLE_VALUE)
                {
                    FindClose(hFindStream);
                }
            }
        }
 private static unsafe string PtrToString(this Interop.FindStreamData fsd)
 => new string(fsd.cStreamName);