首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法使用内存映射文件访问从文件创建CFData对象?

有没有办法使用内存映射文件访问从文件创建CFData对象?
EN

Stack Overflow用户
提问于 2012-09-27 07:07:53
回答 2查看 1.9K关注 0票数 3

我被限制在特定的应用程序中使用CoreFoundation,并且不能访问NSData

我需要使用内存映射来访问文件中的数据,因为该文件可能非常大。对于NSData,我可以使用+dataWithContentsOfURL:options:error:方法并传入NSDataReadingMappedAlways选项来实现这一点。

使用CFData可以做到这一点吗?我能找到的唯一可以直接从文件创建CFData对象的函数是CFURLCreateDataAndPropertiesFromResource()函数,它没有任何设置内存映射标志的选项。

有没有一种较低级别的方法可以使用内存映射读取从文件中加载CFData对象?我是不是一定要去mmap之类的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 07:40:55

您可以从字节缓冲区和计数创建一个CFData()。鉴于此,您应该能够对有问题的文件执行mmap()操作,然后将映射的字节缓冲区传递给CFDataCreateWithBytesNoCopy()。唯一真正的复杂之处在于,您需要使用一个知道如何将munmap()作为bytesDeallocatorCFAllocatorRef

票数 5
EN

Stack Overflow用户

发布于 2012-09-27 09:07:06

与其说这是一个答案,不如说它是一个评论,但是它太长了,不适合评论,所以…

通常,当您不知道如何在Cocoa/Foundation中执行某些操作时,通常值得研究一下GNUstep等效项是如何实现的。当然,GNUstep不是100%实现最新版本的基础,而且它是直接在POSIX而不是CoreFoundation之上编写的,所以它并不总是对…有帮助但通常都是这样的。

NSData.m中,没有+dataWithContentsOfURL:options:error:,但是有一个+dataWithContentsOfMappedFile: (当然还有-initWithContentsOfMappedFile:)方法,以及它所依赖的NSDataMappedFile类的实现。

归根结底,NSDataMappedFilemmap的一个非常简单的包装器,NSData方法只是创建一个NSDataMappedFile并调用它的-initWithContentsOfMappedFile:。唯一真正复杂的是回退代码(确保伪造mmap并只调用[NSData initWithContentsOfFile:])-code,这是您明确不想要的。

因此,这是一个很好的线索,表明您想要完全按照Kevin Ballard的建议来实现这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12611798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档