Wenn man mit dem Microsoft .net Framework 2.0 in C# mit der folgenden Zeile eine Liste der Named Pipes des Systems ermitteln will, kann es zu einer Fehlermeldung kommen:
string[] strPipes = System.IO.Directory.GetFiles(@"\\.\pipe\");
Ursache dafür ist, dass es eine Named Pipe mit einem Namen gibt, der kein gültiger Dateiname ist. Mit dem folgenden Code (C#) gelingt das Auslesen aller Named Pipes:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] struct WIN32_FIND_DATA { public uint dwFileAttributes; public System.Runtime.InteropServices.ComTypes.FILETIME ftCreationTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastAccessTime; public System.Runtime.InteropServices.ComTypes.FILETIME ftLastWriteTime; public uint nFileSizeHigh; public uint nFileSizeLow; public uint dwReserved0; public uint dwReserved1; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string cFileName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] public string cAlternateFileName; } [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern IntPtr FindFirstFile(string lpFileName, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern bool FindNextFile(IntPtr hFindFile, out WIN32_FIND_DATA lpFindFileData); [DllImport("kernel32.dll", SetLastError = true)] static extern bool FindClose(IntPtr hFindFile); private List<string> getNamedPipes() { List<string> liNamedPipes = new List<string>(); WIN32_FIND_DATA lpFindFileData; var ptr = FindFirstFile(@"\\.\pipe\*", out lpFindFileData); liNamedPipes.Add(lpFindFileData.cFileName); while (FindNextFile(ptr, out lpFindFileData)) { liNamedPipes.Add(lpFindFileData.cFileName.ToLower()); } FindClose(ptr); liNamedPipes.Sort(); return liNamedPipes; }
Übrigens kann man mit dem Tool PipeList der Microsoft Sysinternals per Kommandozeile eine Liste aller Named Pipes ausgeben lassen.