2023-04-07 (金)
[C#] Windows で開いている全ての名前付きパイプを取得する
開いている 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 (金)
関連記事
新着記事