37 lines
1.3 KiB
Swift
37 lines
1.3 KiB
Swift
// Copyright (C) 2026 ysicing
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import Foundation
|
|
|
|
/// 只保留上一轮的文件元数据和汇总,不常驻逐消息解析状态。
|
|
/// 文件集、内容、日期或时区变化时仍走原有增量检查点和跨文件去重流程。
|
|
struct LocalUsageScanCache {
|
|
struct Revision: Equatable {
|
|
struct File: Equatable {
|
|
let path: String
|
|
let size: UInt64
|
|
let modified: Date
|
|
let inode: UInt64
|
|
}
|
|
let files: [File]
|
|
let day: Date
|
|
let timeZone: String
|
|
|
|
init(files: [URL], now: Date, calendar: Calendar) throws {
|
|
self.files = try files.map { url in
|
|
try Task.checkCancellation()
|
|
let path = url.resolvingSymlinksInPath().path
|
|
let attributes = try FileManager.default.attributesOfItem(atPath: path)
|
|
return File(path: path, size: (attributes[.size] as? NSNumber)?.uint64Value ?? 0,
|
|
modified: attributes[.modificationDate] as? Date ?? .distantPast,
|
|
inode: (attributes[.systemFileNumber] as? NSNumber)?.uint64Value ?? 0)
|
|
}
|
|
day = calendar.startOfDay(for: now)
|
|
timeZone = calendar.timeZone.identifier
|
|
}
|
|
}
|
|
|
|
let revision: Revision
|
|
let report: LocalUsageReport
|
|
}
|