在理想情况下,获取命名管道的列表非常简单,可以在这里找到:
How can I get a list of all open named pipes in Windows?

但是提到的解决方案

var namedPipes = Directory.GetFiles(@"\\.\pipe\");

有时会有不可预测的结果。上面的链接中提到了其中之一(路径异常中的无效字符)。今天,我遇到了一个异常(exception):



问题是,.net中是否有任何真正可行的解决方案来获取所有打开的命名管道的列表?谢谢

最佳答案

我研究了Directory类的源代码并找到了灵感。这是一个有效的解决方案,可为您提供所有打开的命名管道的列表。我的结果不包含\\。\pipe\前缀,因为在Directory.GetFiles的结果中可以看到它。我在WinXp SP3,Win 7,Win 8.1上测试了我的解决方案。

    [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 static void Main(string[] args)
    {
        var namedPipes = new List<string>();
        WIN32_FIND_DATA lpFindFileData;

        var ptr = FindFirstFile(@"\\.\pipe\*", out lpFindFileData);
        namedPipes.Add(lpFindFileData.cFileName);
        while (FindNextFile(ptr, out lpFindFileData))
        {
            namedPipes.Add(lpFindFileData.cFileName);
        }
        FindClose(ptr);

        namedPipes.Sort();

        foreach (var v in namedPipes)
            Console.WriteLine(v);

        Console.ReadLine();
     }

关于c# - 如何获取Windows中所有打开的命名管道的列表并避免可能的异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25109491/

10-10 21:17