gpt4 book ai didi

objective-c - 如何使用 NSFileHandle 的 readabilityHandler 检查文件结尾?

转载 作者:太空狗 更新时间:2023-10-30 03:22:22 24 4
gpt4 key购买 nike

我正在使用 readabilityHandler block 从 NSFileHandle(来自 NSPipe)读取数据:

fileHandle.readabilityHandler = ^( NSFileHandle *handle ) {
[self processData: [handle availableData]];
}

这很好用,我得到了所有我希望输入到我的 processData 方法中的数据。问题是我需要知道读取最后一 block 数据的时间。如果 availableData 到达文件末尾,它应该返回一个空的 NSData 实例,但问题是在 EOF 时不会再次调用可达性处理程序。

我找不到关于如何在 EOF 上获得某种通知或回调的任何信息。那我错过了什么? Apple 真的提供没有 EOF 回调的异步读取 API 吗?

顺便说一下,我不能使用基于 runloop 的 readInBackgroundAndNotify 方法,因为我没有可用的 runloop。如果我不能让它与 NSFileHandle API 一起工作,我可能会直接使用调度源来执行 IO。

最佳答案

我个人将当前文件偏移量与当前文件位置进行比较并停止阅读。

extension FileHandle {
func stopReadingIfPassedEOF() {
let pos = offsetInFile
let len = seekToEndOfFile()
if pos < len {
// Resume reading.
seek(toFileOffset: pos)
}
else {
// Stop.
// File offset pointer stays at the EOF.
readabilityHandler = nil
}
}
}

很长一段时间我都无法理解为什么要这样设计,但现在我认为这可能是故意的。

在我看来,Apple 基本上将 FileHandle 定义为一个无限流,因此,除非您关闭文件,否则 EOF 没有很好地定义。 FileHandle 看起来更像是一个“ channel ”。

还不清楚如果另一个进程在您读取文件时向文件添加/从文件删除一些数据会发生什么。在这种情况下,EOF 是什么?据我所知,Apple 文档中没有提及此案例。据我所知,与其他类 Unix 系统不同,macOS 中没有真正的独占文件 I/O 锁。

在我看来,如果I/O不够快,availableData可以随时返回空数据,而readabilityHandler根本不关心EOF。

关于objective-c - 如何使用 NSFileHandle 的 readabilityHandler 检查文件结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15851391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com