internal static IEnumerable <AlternateDataStreamInfo> EnumerateAlternateDataStreamsCore(KernelTransaction transaction, string path, PathFormat pathFormat) { using (var buffer = new SafeGlobalMemoryBufferHandle(Marshal.SizeOf(typeof(NativeMethods.WIN32_FIND_STREAM_DATA)))) { path = Path.GetExtendedLengthPathCore(transaction, path, pathFormat, GetFullPathOptions.RemoveTrailingDirectorySeparator | GetFullPathOptions.CheckInvalidPathChars | GetFullPathOptions.CheckAdditional); using (var handle = transaction == null ? NativeMethods.FindFirstStreamW(path, NativeMethods.StreamInfoLevels.FindStreamInfoStandard, buffer, 0) : NativeMethods.FindFirstStreamTransactedW(path, NativeMethods.StreamInfoLevels.FindStreamInfoStandard, buffer, 0, transaction.SafeHandle)) { if (handle.IsInvalid) { int errorCode = Marshal.GetLastWin32Error(); if (errorCode == Win32Errors.ERROR_HANDLE_EOF) { yield break; } NativeError.ThrowException(errorCode); } while (true) { NativeMethods.WIN32_FIND_STREAM_DATA data = buffer.PtrToStructure <NativeMethods.WIN32_FIND_STREAM_DATA>(0); yield return(new AlternateDataStreamInfo(path, data)); if (!NativeMethods.FindNextStreamW(handle, buffer)) { int lastError = Marshal.GetLastWin32Error(); if (lastError == Win32Errors.ERROR_HANDLE_EOF) { break; } NativeError.ThrowException(lastError, path); } } } } }
internal AlternateDataStreamInfo(string filePath, NativeMethods.WIN32_FIND_STREAM_DATA findData) { m_name = ParseStreamName(findData.cStreamName); m_size = findData.StreamSize; m_filePath = filePath; }
internal AlternateDataStreamInfo(string fullPath, NativeMethods.WIN32_FIND_STREAM_DATA findData) : this() { StreamName = ParseStreamName(findData.cStreamName); Size = findData.StreamSize; _fullPath = fullPath; }