Swift SMB 客户端库和 iOS/macOS 文件浏览器应用程序。此库为 SMB 协议提供了一个高级接口,并允许您访问远程 SMB 服务器上的文件。使用 Swift 编写,不依赖于外部库。
SMBClient
类隐藏了底层 SMB 协议,并为常见用例提供了更高级别的接口。以下示例演示了如何在远程 SMB 服务器上的共享驱动器中列出文件。
import SMBClient
let client = SMBClient(host: "198.51.100.50")
try await client.login(username: "alice", password: "secret")
try await client.connectShare("Public")
let files = try await client.listDirectory("")
print(files.map { $0.fileName })
try await client.disconnectShare()
try await client.logoff()
如果您想直接使用底层 SMB 协议,可以使用 Session
类。Session
类提供了一组与 SMB 消息对应的函数。您可以获得对 SMB 协议更精细的控制。
import SMBClient
let session = Session(host: "198.51.100.50")
try await session.connect()
try await session.negotiate()
try await session.sessionSetup(username: "alice", password: "secret")
try await session.treeConnect(path: "Public")
let files = try await session.queryDirectory(path: "", pattern: "*")
print(files.map { $0.fileName })
try await session.treeDisconnect()
try await session.logoff()
let client = SMBClient(host: "198.51.100.50")
try await client.login(username: "alice", password: "secret")
let shares = try await client.listShares()
print(shares.map { $0.name })
try await client.connectShare("Public")
let files = try await client.listDirectory("Documents/Presentations")
print(files.map { $0.fileName })
let data = try await client.download(path: "Pictures/IMG_0001.jpg")
try await client.upload(data: data, path: "Documents/Presentations/Keynote.key")
将以下行添加到您的 Package.swift
文件中的依赖项中
dependencies: [
.package(url: "https://github.com/kishikawakatsumi/SMBClient.git", .upToNextMajor(from: "0.1.0"))
]
支持 SMB 2.0 (又名 SMB2
)。请参阅 Header 以了解协议支持,该支持遵循 SMB2 数据包头开放规范。
要连接到 macOS 文件共享,您需要在“文件共享”部分的“共享”系统设置中启用“Windows 文件共享”。这将会在您的 macOS 上启用 NTLM v2 身份验证。
此库不支持 SMB1
,并且在不久的将来也不会支持 SMB 1.0,这是因为 SMB1 和 SMB2 不兼容,并且具有完全不同的数据包结构。
相关地,不支持使用先于 SMB 的 Apple 文件协议 (AFP) 连接到 macOS 服务器。
OS X 10.9 Mavericks
及更高版本支持 SMB 作为主要的文件共享协议。
开源项目依靠像您这样的人的慷慨和支持而蓬勃发展。如果您认为这个项目有价值,请考虑扩展您的支持。为项目做出贡献不仅可以维持其增长,还可以帮助推动创新和改进其功能。
要支持这个项目,您可以通过 GitHub Sponsors 成为赞助商。您的贡献将不胜感激,并将有助于保持项目的活力和蓬勃发展。感谢您的考虑!❤️