我正在使用一个库,它可以从文件中读取或写入我需要的一些元数据。
我只需要阅读,我就知道我的文件存储速度较慢。
我注意到,虽然读取我需要的值非常快,但关闭文件却很慢。基本上,如果我 open(); read(); close()
我的程序的每个文件都非常慢,但如果我只 open(); read()
操作期间和 close()
就在退出之前(即,我让运行时在泄漏对象的最终确定期间关闭文件),程序运行得很快,但在退出之前停止了几秒钟 - 当文件被关闭时。
目前,为了加快速度,我在打开文件之前更改文件权限,并在读取元数据后恢复权限。它有效,但感觉不对。
在linux/unix中有没有办法让文件暂时对当前进程显示为只读?我无法使用 setuid(2),因为该程序是由非特权用户运行的(或者我对此有误吗?)。
详情
图书馆是 taglib-ruby这又是 taglib 的包装器的 C++ API。
程序可能会列出设备上的轨道,并且需要以秒为单位知道它们的长度(我使用 taglib 的原因),但相同的媒体将被写入(上传新轨道,删除一些轨道),因此我不能只是强制用户以只读方式安装设备。
我意识到更好的解决方案是修补 taglib 以允许指定我只想读取元数据,然后修补 taglib-ruby 以包装新的 API。但我还不能胜任,而且我已经有了一个解决方法,因此没有太多的积极性去走这条路。我只是想知道是否有更好的解决方法。
最佳答案
在 C++ 中,你可以这样做:(我希望你也可以在 ruby 中这样做)
TagLib::IOStream * stream = new TagLib::FileStream("blow.mp4", true);
TagLib::MP4::File * file = new TagLib::MP4::File( stream );
TagLib::FileRef * fileref = new TagLib::FileRef( file );
TagLib::String artist = fileref->tag()->artist();
这里,FileStream 构造函数的第二个参数表示只读。 我已经使用“strace”确认开放系统调用是通过 O_RDONLY 调用的
关于linux - 使文件对库函数显示为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989247/