AMSMB2

这是一个小型的 Swift 库,适用于 iOS、macOS 和 tvOS,它封装了 libsmb2,允许连接 SMB2/3 共享并执行文件操作。

Swift Version Compatibility Platform Compatibility License Release version

入门指南

要使用 AMSMB2,请将以下依赖项添加到您的 Package.swift 文件中

dependencies: [
    .package(url: "https://github.com/amosavian/AMSMB2", .upToNextMinor(from: "3.0.0"))
]

然后,您可以将特定的产品依赖项添加到您的目标中

dependencies: [
    .product(name: "AMSMB2", package: "AMSMB2"),
]

用法

只需阅读内联帮助即可了解每个函数的功能。 这非常简单,而且是线程安全的。

要列出目录中的文件和进行文件操作,您必须使用以下模板

import AMSMB2

class SMBClient: @unchecked Sendable {
    /// connect to: `smb://guest@XXX.XXX.XX.XX/share`
    
    let serverURL = URL(string: "smb://XXX.XXX.XX.XX")!
    let credential = URLCredential(user: "guest", password: "", persistence: URLCredential.Persistence.forSession)
    let share = "share"
    
    lazy private var client = SMB2Manager(url: self.serverURL, credential: self.credential)!
    
    private func connect() async throws -> SMB2Manager {
        // AMSMB2 can handle queueing connection requests
        try await client.connectShare(name: self.share)
        return self.client
    }
    
    func listDirectory(path: String) {
        Task {
            do {
                let client = try await connect()
                let files = try await client.contentsOfDirectory(atPath: path)
                for entry in files {
                    print(
                        "name:", entry[.nameKey] as! String,
                        ", path:", entry[.pathKey] as! String,
                        ", type:", entry[.fileResourceTypeKey] as! URLFileResourceType,
                        ", size:", entry[.fileSizeKey] as! Int64,
                        ", modified:", entry[.contentModificationDateKey] as! Date,
                        ", created:", entry[.creationDateKey] as! Date)
                }
            } catch {
                print(error)
            }
        }
    }
    
    func moveItem(path: String, to toPath: String) {
        Task {
            do {
                let client = try await self.connect()
                try await client.moveItem(atPath: path, toPath: toPath)
                print("\(path) moved successfully.")
                
                // Disconnecting is optional, it will be called eventually
                // when `AMSMB2` object is freed.
                // You may call it explicitly to detect errors.
                try await client.disconnectShare()
            } catch {
                print(error)
            }
        }
    }
}

许可证

虽然项目附带的源代码采用 MIT 许可证,但它静态链接到 libsmb2,后者采用 LGPL v2.1,因此整个项目变为 LGPL v2.1

如果您打算在 App Store 上发布您的应用程序,您必须将此库动态链接到您的应用程序。