如何在 .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 上的多个示例文件上进行了测试并且工作正常。但是,我没有设法测试所有类型的文件,但似乎 Device
或 System
等属性代表七种 Linux 文件类型中的一种以上类型。
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 上的多个示例文件上进行了测试并且工作正常。但是,我没有设法测试所有类型的文件,但似乎 Device
或 System
等属性代表七种 Linux 文件类型中的一种以上类型。