如何检查路径是不是为 C# 文件?

Posted

技术标签:

【中文标题】如何检查路径是不是为 C# 文件?【英文标题】:How to check is a path is a file with C#?如何检查路径是否为 C# 文件? 【发布时间】:2022-01-19 01:30:35 【问题描述】:

这是一个看似简单的问题,但我还没有找到令人满意的解决方案。

let f = FileInfo(e)
let fileFlag = f.Attributes.HasFlag(FileAttributes.Normal)
logger <| sprintf "%s :: %A :: %A" e fileFlag f.Attributes

这会产生以下输出:

/tmp/com.apple.launchd.qq7qSI6dyD/Listeners :: true :: Normal

令我惊讶的是,路径是一个套接字:

> file /tmp/com.apple.launchd.qq7qSI6dyD/Listeners
/tmp/com.apple.launchd.qq7qSI6dyD/Listeners: socket

根据FileAttributes Enum 文档:

正常 128

该文件是没有特殊属性的标准文件。该属性仅在单独使用时有效。 Normal 在 Windows、Linux 和 macOS 上受支持。

有没有办法检查路径是否真的是普通文件(不是套接字、不是符号链接、不是设备等)。

例如在 Python 中:

> python -c "import os; import sys; print(os.path.isfile(sys.argv[1]))"
/tmp/com.apple.launchd.qq7qSI6dyD/Listeners
False

详细说明:

> stat -f "%N: %HT%SY" /tmp/**/*
/tmp/b: Symbolic Link -> a
/tmp/com.apple.launchd.qq7qSI6dyD: Directory
/tmp/com.apple.launchd.qq7qSI6dyD/Listeners: Socket
/tmp/fseventsd-uuid: Regular File
/tmp/powerlog: Directory
/tmp/test: Regular File
/tmp/tmux-501: Directory
/tmp/tmux-501/default: Socket

【问题讨论】:

套接字、设备、符号链接等不都是文件的所有类型,就像.txt 文件一样吗? 我想要来自 Python 的 os.path.isfile 行为的精确副本。 对我来说这似乎是一个运行时错误。套接字不应具有 Normal IMO 属性。您可能希望将其作为问题提交到 Github。 在底层,python 的 isfile 使用 .stat 程序来确定该信息。我认为 .Net Core 中还没有原生的等价物——但它可能存在于 Mono。 这能回答你的问题吗? File permissions on Linux/Unix with .NET Core 【参考方案1】:

截至今天 (2021.12.16),.net 无法识别 POSIX 意义上的文件。

解决方法是通过以下方式使用 Mono.Unix:

open Mono.Unix

let fileStat =
    UnixFileSystemInfo.GetFileSystemEntry(pathEntry)

let isRegular = fileStat.IsRegularFile

【讨论】:

以上是关于如何检查路径是不是为 C# 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不检查路径扩展名的情况下检查文件是不是为图像文件?

如何从 C# 或 Javascript 检查文件是不是存在?

如何检查文件路径是不是存在

c#中如何检测文件路径是不是存在

如何使用节点 js 检查“s3”/“azure”路径中是不是存在文件

通过 C# 确定字符串是不是是有效的文件路径