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);