2013-04-13 39 views
2

我正在使用一個庫,可以讀取或寫入一些我需要的文件的元數據。使文件出現只讀庫函數

我只需要閱讀,我知道我的文件存儲緩慢。

我注意到,雖然讀取我需要的值非常快,關閉文件很慢。基本上,如果我的每個文件我的程序都很慢,但是如果我在運行期間只有open(); read(),並且在退出之前(即,讓我的運行時間在泄漏對象完成期間關閉文件),程序運行得很快,但停止在退出之前幾秒鐘 - 文件關閉時。另一方面,如果我從文件中刪除了寫入權限,這種情況不會發生:似乎只讀文件的打開速度比打開讀寫的文件快得多。這可能是因爲該庫在關閉時寫入元數據「只是爲了確定」該文件是可寫的,還是其他原因,但無論如何 - 不可能爲庫指定我不打開文件僅用於讀取:它試圖變得聰明並根據文件許可權來決定。

目前爲了加快速度,我在打開文件權限之前更改文件權限,並在讀取元數據後恢復權限。它有效,但感覺不對。

在linux/unix中有沒有辦法讓文件暫時顯示爲只讀到當前進程?我不能使用setuid(2),因爲程序是由無特權的用戶運行的(或者我錯了嗎?)。

細節

該庫是taglib-ruby其又圍繞taglib的C++ API的包裝。

該程序可能會列出設備上的軌道,並需要知道它們的長度(我使用taglib的原因),但同一個媒體將被寫入(新軌道上傳,一些軌道被刪除),因此我可以'只需強制用戶只讀設備。

我意識到一個更好的解決方案是修補taglib以允許指定我只想讀取元數據,然後修補taglib-ruby來包裝新的API。但是我不能很好地解決這個問題,而且我已經有了一個解決方法,因此在這條路線上沒有太多的限制。我只是想知道是否有更好的解決方法。

+0

它是調用'open()'函數庫,還是打開文件並傳遞一個'FILE *'作爲參數庫中的函數? – Rubens

+1

使用「-bind,ro」開關重新掛載目錄。並要求taglib在只讀文件系統上運行。它應該停止庫在打開文件在寫入模式(不知道是否所有發行版支持-bind開關) – Icarus3

+1

對不起,我不明白。你訪問這個文件,然後''atime'在'close()'上更新。這會導致文件系統的write()。另外:[relatime](http://kerneltrap.org/node/14148)。至少,你可以用** noatime **排除'atime'。使用** ro **安裝將具有與[Icarus3](http://stackoverflow.com/users/1919896/icarus3)相同的效果。我想圖書館可能會重寫一些東西;修改時間是否已更新?至少可以提供有用的信息。 –

回答

2

在C++中,你可以做這樣的事情:(我希望你能做到這一點的紅寶石太)

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調用

+0

我無法立即在ruby中使用它,但我建議ruby包裝作者使其成爲可能。如果推動來推,我準備自己添加,如果只是爲了學習Ruby的C API。 – artm