internal static List <AlternateStreamData> GetStreams(string path) { if (path == null) { throw new ArgumentNullException("path"); } List <AlternateStreamData> list = new List <AlternateStreamData>(); AlternateStreamNativeData lpFindStreamData = new AlternateStreamNativeData(); SafeFindHandle hndFindFile = NativeMethods.FindFirstStreamW(path, NativeMethods.StreamInfoLevels.FindStreamInfoStandard, lpFindStreamData, 0); if (hndFindFile.IsInvalid) { throw new Win32Exception(); } try { do { AlternateStreamData data2; lpFindStreamData.Name = lpFindStreamData.Name.Substring(1); string b = ":$DATA"; if (!string.Equals(lpFindStreamData.Name, b, StringComparison.OrdinalIgnoreCase)) { lpFindStreamData.Name = lpFindStreamData.Name.Replace(b, ""); } data2 = new AlternateStreamData { Stream = lpFindStreamData.Name, Length = lpFindStreamData.Length, }; data2.FileName = path.Replace(data2.Stream, ""); data2.FileName = data2.FileName.Trim(new char[] { ':' }); list.Add(data2); lpFindStreamData = new AlternateStreamNativeData(); }while (NativeMethods.FindNextStreamW(hndFindFile, lpFindStreamData)); int error = Marshal.GetLastWin32Error(); if (error != 0x26) { throw new Win32Exception(error); } } finally { hndFindFile.Dispose(); } return(list); }
internal static List<AlternateStreamData> GetStreams(string path) { if (path == null) { throw new ArgumentNullException("path"); } List<AlternateStreamData> list = new List<AlternateStreamData>(); AlternateStreamNativeData lpFindStreamData = new AlternateStreamNativeData(); SafeFindHandle hndFindFile = NativeMethods.FindFirstStreamW(path, NativeMethods.StreamInfoLevels.FindStreamInfoStandard, lpFindStreamData, 0); if (hndFindFile.IsInvalid) { throw new Win32Exception(); } try { do { AlternateStreamData data2; lpFindStreamData.Name = lpFindStreamData.Name.Substring(1); string b = ":$DATA"; if (!string.Equals(lpFindStreamData.Name, b, StringComparison.OrdinalIgnoreCase)) { lpFindStreamData.Name = lpFindStreamData.Name.Replace(b, ""); } data2 = new AlternateStreamData { Stream = lpFindStreamData.Name, Length = lpFindStreamData.Length, }; data2.FileName = path.Replace(data2.Stream, ""); data2.FileName = data2.FileName.Trim(new char[] { ':' }); list.Add(data2); lpFindStreamData = new AlternateStreamNativeData(); } while (NativeMethods.FindNextStreamW(hndFindFile, lpFindStreamData)); int error = Marshal.GetLastWin32Error(); if (error != 0x26) { throw new Win32Exception(error); } } finally { hndFindFile.Dispose(); } return list; }
/// <summary> /// List all of the streams on a file /// </summary> /// <param name="path">The fully-qualified path to the file.</param> /// <returns>The list of streams (and their size) in the file.</returns> internal static List<AlternateStreamData> GetStreams(string path) { if (path == null) throw new ArgumentNullException("path"); List<AlternateStreamData> alternateStreams = new List<AlternateStreamData>(); AlternateStreamNativeData findStreamData = new AlternateStreamNativeData(); SafeFindHandle handle = NativeMethods.FindFirstStreamW( path, NativeMethods.StreamInfoLevels.FindStreamInfoStandard, findStreamData, 0); if (handle.IsInvalid) throw new Win32Exception(); try { do { // Remove the leading ':' findStreamData.Name = findStreamData.Name.Substring(1); // And trailing :$DATA (as long as it's not the default data stream) string dataStream = ":$DATA"; if (!String.Equals(findStreamData.Name, dataStream, StringComparison.OrdinalIgnoreCase)) { findStreamData.Name = findStreamData.Name.Replace(dataStream, ""); } AlternateStreamData data = new AlternateStreamData(); data.Stream = findStreamData.Name; data.Length = findStreamData.Length; data.FileName = path.Replace(data.Stream, ""); data.FileName = data.FileName.Trim(Utils.Separators.Colon); alternateStreams.Add(data); findStreamData = new AlternateStreamNativeData(); } while (NativeMethods.FindNextStreamW(handle, findStreamData)); int lastError = Marshal.GetLastWin32Error(); if (lastError != NativeMethods.ERROR_HANDLE_EOF) throw new Win32Exception(lastError); } finally { handle.Dispose(); } return alternateStreams; }