如何检查路径是不是为 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 检查文件是不是存在?