Exemplo n.º 1
0
        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;
 }