我正在使用一个可以从文件中读取或写入我需要的元数据的库。
我只需要阅读,我知道我的文件存储速度很慢。
我注意到在阅读我需要的值非常快时,关闭文件的速度很慢。基本上,如果我open(); read(); close()
每个文件我的程序很慢,但是如果我在操作期间只open(); read()
而在退出之前close()
(即我让我的运行时间在完成期间关闭文件)泄漏的对象)程序运行速度很快,但在退出之前停止几秒钟 - 文件关闭时。
另一方面,如果我从文件中删除写入权限,则不会发生这种情况:似乎只读文件打开只读文件比打开读写文件快得多。如果文件是可写的,或者其他原因,可能是库写关闭“只是为了确定”的元数据,但无论如何 - 我不可能为库指定我不打开文件只是为了阅读:它试图变得聪明并根据文件权限决定。
目前为了加快速度,我在打开文件权限之前更改文件权限,并在读取元数据后恢复权限。它有效,但感觉不对。
linux / unix中有没有办法让文件暂时只显示当前进程?我不能使用setuid(2)因为程序是由非特权用户运行的(或者我错了吗?)。
详情
库是taglib-ruby,而这又是taglib C ++ API的包装。
程序可能会列出设备上的曲目并需要知道它们的长度(我使用taglib的原因),但是会写入相同的媒体(上传新曲目,删除一些曲目)因此我不能只是强制用户只读装载设备。
我意识到更好的解决方案是修补taglib以允许指定我只想读取元数据,然后修补taglib-ruby来包装新的API。但是我不能接受它,而且我已经有了一个解决方法,因此沿着那条路走下来并没有那么多的麻烦。我只是想知道是否有更好的解决方法。
答案 0 :(得分:2)
在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
调用开放系统调用