如何从 NSFileHandle * 获取 FILE *?

Posted

技术标签:

【中文标题】如何从 NSFileHandle * 获取 FILE *?【英文标题】:How to get FILE * from NSFileHandle *? 【发布时间】:2013-07-26 08:34:03 【问题描述】:

旧的解析器依赖FILE * 工作。但是,适用于 ios 的 Dropbox Sync API 返回 NSFileHandle * 而不是 FILE * 作为文件句柄。

所以我尝试使用fileDescriptorNSFileHandle

- (NSFileHandle )readHandle:(DBError *)error

返回文件的只读文件句柄。如果文件不是 缓存然后该方法将阻塞,直到文件被下载。 返回

如果文件可以读取,则为文件句柄,如果发生错误,则为 nil。

并作为FILE *传递:

- (void)loadDBFile:(DBFile *)dbFile

    DBError *dbError;
    NSFileHandle *fileHandle = [dbFile readHandle:&dbError];
    if (fileHandle) 
         FILE *file = fileHandle.fileDescriptor;
         fseek(file, 0, SEEK_END); // EXE_BAD_ACCESS here!
         // ...
    

但是,fseek 行中有一个 EXE_BAD_ACCESS

【问题讨论】:

【参考方案1】:

fileDescriptor 返回底层文件描述符,一个简单的整数,而不是 FILE 对象(它包装了一个文件描述符,但不是一回事)。使用fdopen()从文件描述符中获取FILE对象:

FILE *file = fdopen([filehandle fileDescriptor], "r"); // Create a read-only FILE object

【讨论】:

以上是关于如何从 NSFileHandle * 获取 FILE *?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NSFileHandle 打开文本文件

NSFileManager和NSFileHandle

如何从函数获取数据到变量[重复]

如何从函数获取数据到变量[重复]

Foundation框架中的NSFileHandle一

带有流式视频或 NSFileHandle 的 AVPlayer