如何在 .NET 中获取 Linux 文件类型(常规、durector、符号链接、字符设备等)?

How to get the Linux file type (regular, durector, symlink, char device, etc) in .NET?

Linux中有 7 种不同类型的文件:

1. - : regular file
2. d : directory
3. c : character device file
4. b : block device file
5. s : local socket file
6. p : named pipe
7. l : symbolic link

Linuxshell 获取给定文件或路径类型的方法是通过 ls 命令,或通过特定的检查,如:

if [ -f path/to/file ] then

仅当 path/to/file 指向常规文件(不是目录,不是符号链接等)时才会进入 if 正文

是否有 .NET 方法以 Linux 术语检查路径类型?例如,我想检查一下只有在 File.Exists 指向常规文件时才会 return 为真?检查其他类型怎么样。

即使现在使用 .NET 5 检查这是不可能的,这个问题仍然存在,直到通过托管代码成为可能,而不记录到“调用 bash -> 获取结果 ->处理输出 -> 包装成 POCO" 方式。

有趣的是,甚至像 Java doesn't 这样 Linux 友好的语言也提供了一个全面的解决方案。

幸运的是,File.GetAttributes(string) 方法提供了有用的(但仍然没有问题所寻找的那么完整)信息。

var path = "/path/to/file";
var attributes = File.GetAttributes(path);

if (attributes.HasFlag(FileAttributes.Directory))
    Console.WriteLine("directory");
else if (attributes.HasFlag(FileAttributes.Normal))
    Console.WriteLine("file");
else if (attributes.HasFlag(FileAttributes.ReparsePoint))
    Console.WriteLine("link");
else if (attributes.HasFlag(FileAttributes.System))
    Console.WriteLine("system");

上面的代码在 WSL2 上的多个示例文件上进行了测试并且工作正常。但是,我没有设法测试所有类型的文件,但似乎 DeviceSystem 等属性代表七种 Linux 文件类型中的一种以上类型。