2

我正在使用一个可以从文件中读取或写入一些我需要的元数据的库。

我只需要阅读,我知道我的文件存储速度很慢。

我注意到虽然读取我需要的值非常快,但关闭文件却很慢。基本上,如果我open(); read(); close()每个文件我的程序都很慢,但如果我只open(); read()在操作期间和close()退出之前(即我让我的运行时在泄漏对象的最终确定期间关闭文件)程序运行得很快,但会停止几秒钟就在退出之前 - 当文件被关闭时。

另一方面,如果我从文件中删除写权限,这不会发生:似乎以只读方式打开的文件比以读写方式打开的文件关闭得快得多。如果文件是可写的,或者其他原因,库可能会在关闭时写入元数据“只是为了确定”,但无论如何 - 无法为库指定我不想打开文件仅用于阅读:它试图变得智能并根据文件权限做出决定。

目前为了加快速度,我正在打开文件之前更改文件权限,并在读取元数据后恢复权限。它有效,但感觉不对。

linux / unix 有没有办法让文件暂时对当前进程显示为只读?我不能使用 setuid(2) 因为程序是由非特权用户运行的(或者我错了吗?)。

细节

该库是taglib-ruby,它又是taglib的 C++ API 的包装器。

该程序可能会列出设备上的曲目,并且需要以秒为单位知道它们的长度(我使用 taglib 的原因),但是将写入相同的媒体(上传新曲目,删除一些曲目)因此我不能只强迫用户以只读方式安装设备。

我意识到更好的解决方案是修补 taglib 以允许指定我只想读取元数据,然后修补 taglib-ruby 以包装新的 API。但我无法做到这一点,而且我已经有一个解决方法,因此沿着这条路线走下去并没有太大的积极性。我只是想知道是否有更好的解决方法。

4

1 回答 1

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 调用的

于 2013-04-14T13:10:24.860 回答