[C#] Windows で開いている全ての名前付きパイプを取得する

2023-04-07 (金)

開いている NamedPipe の名前を全て取得する方法です。
.NET Core と .NET Framework の違いで例外が発生する注意点があります。

環境

  • .NET 7.0.202
  • C# 11.0
  • Visual Studio 2022 Version 17.5.3
  • Windows 10 Pro 64bit 22H2 19045.2728

方法

using System.IO;

foreach (var pipe in Directory.EnumerateFiles(@"\\.\pipe\"))
{
    Console.WriteLine(pipe);
}

使用例

using System.IO;
using System.IO.Pipes;
using System.Linq;

void Main()
{
    const string pipeName = "testpipe";

    Console.WriteLine(ExistsNamedPipe(pipeName)); // False

    // NamedPipe を開く
    using (new NamedPipeServerStream(pipeName))
    {
        Console.WriteLine(ExistsNamedPipe(pipeName)); // True
    }

    Console.WriteLine(ExistsNamedPipe(pipeName)); // false
}

static bool ExistsNamedPipe(string pipeName)
{
    return Directory.EnumerateFiles(@"\\.\pipe\")
        .Any(x => x.AsSpan(9).SequenceEqual(pipeName));
}

注意

.NET Core で \\.\pipe を指定すると例外が発生する

\\.\pipe を指定すると System.IO.IOException (パラメーターが間違っています。 : '\\.\pipe') が発生します。
.NET Core 3.1, 5.0, 6.0, 7.0 で例外になることを確認しました。
しかし、.NET Framework 4.8 では例外になりません。

Version\\.\pipe\\\.\pipe
.NET Framework 4.8
.NET Core 3.1
.NET 5.0
.NET 6.0
.NET 7.0

必ず、@"\\.\pipe\"で指定しておきましょう。

感謝

2023-04-07 (金)