2017-01-02 101 views
0

看來,當你試圖從一個MP3的評級標籤庫,並像它被打開就會造成讀取訪問衝突:標籤庫Qt的讀訪問衝突

enter image description here

這裏是我的代碼:

QFile fileInfo(file); 
fileInfo.open(QIODevice::ReadOnly); 
if(fileInfo.isReadable()) 
{ 
    TagLib::MPEG::File mpeg(file.toStdString().c_str()); 
    bool isRead = mpeg.isReadable(file.toStdString().c_str()); 
    if(isRead) 
     rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating(); 
} 

我試過添加try/catch但仍然失敗。我試過QLockFile沒有成功。有沒有什麼方法可以測試一個文件是否擁有文件的獨佔權限或捕獲讀取訪問衝突?

更新 得益於尖端我修改代碼來檢查無效值第一:

if(mpeg.ID3v2Tag() != 0) 
{ 
    if(dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front()) != 0) 
    { 
     rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating(); 
    } 
} 

回答

1

讀訪問衝突無關與文件讀取,你的程序試圖做一個只讀訪問它無法訪問的內存。

在你的情況下,你試圖訪問一個空指針(0x0)。

你必須在你的代碼最後線上的兩個指針訪問操作,cehck既爲試圖調用方法對它們

+0

什麼是分裂這件事的好方法。當我第一次嘗試TagLib :: ID3v2 :: Tag * id3v2 = mpeg.ID3v2Tag();我得到ID3V2是未聲明的標識符 – adviner

+0

奇怪,看起來有效的給我,如果'Tag'是在命名空間中有效的類型'標籤庫:: ID3v2' –

0

你打的,因爲你在this question有代碼這個問題之前,不是一個空指針。您以錯誤的方式創建了一個POPM框架,然後劇組失敗。

注意dynamic_cast是一個checked cast類型。它在失敗時返回零,因爲它在這裏。您需要在假設它有效之前檢查返回值(否則通常會使用static_cast)。