diff --git a/MusicPlayer2/SongDataManager.cpp b/MusicPlayer2/SongDataManager.cpp index 1023fc6a..5b7b86e6 100644 --- a/MusicPlayer2/SongDataManager.cpp +++ b/MusicPlayer2/SongDataManager.cpp @@ -240,9 +240,8 @@ void CSongDataManager::LoadSongData(std::wstring path) ar >> song_info.total_discs; } m_song_data[song_info] = song_info; // 将读取到的一首歌曲信息添加到映射容器中 - - std::wstring file_name{ song_info.GetFileName() }; - m_song_file_name_map[file_name].push_back(song_info.file_path); + + UpdateFileNameMap(song_info); } } catch (CArchiveException* exception) @@ -402,6 +401,7 @@ void CSongDataManager::AddItem(const SongInfo& song) ASSERT(!song.file_path.empty()); m_song_data[song] = song; m_song_data_modified = true; + UpdateFileNameMap(song); } bool CSongDataManager::RemoveItem(const SongKey& key) @@ -471,6 +471,12 @@ void CSongDataManager::ChangeFilePath(const wstring& file_path, const wstring& n } } +void CSongDataManager::UpdateFileNameMap(const SongInfo& song) +{ + std::wstring file_name{ song.GetFileName() }; + m_song_file_name_map[file_name].insert(song.file_path); +} + //计算两个字符串右侧匹配的字符数量 static int CalcualteStringRightMatchedCharNum(const std::wstring& str1, const std::wstring& str2) { @@ -496,23 +502,23 @@ bool CSongDataManager::FixWrongFilePath(wstring& file_path) const { if (iter->second.size() == 1) //媒体库中同名的文件只有一个时,直接修改为该文件的路径 { - file_path = iter->second.front(); + file_path = *iter->second.begin(); fixed = true; } else if (iter->second.size() > 1) //媒体库中同名的文件有多个时,查找两个路径末尾相同字符数量最多的那项 { - size_t best_match_index{}; + std::wstring best_match_path; int max_matched_char_mun{}; - for (size_t i{}; i < iter->second.size(); i++) + for (const auto& path : iter->second) { - int cur_matched_char_num = CalcualteStringRightMatchedCharNum(file_path, iter->second[i]); + int cur_matched_char_num = CalcualteStringRightMatchedCharNum(file_path, path); if (cur_matched_char_num > max_matched_char_mun) { max_matched_char_mun = cur_matched_char_num; - best_match_index = i; + best_match_path = path; } } - file_path = iter->second[best_match_index]; + file_path = best_match_path; fixed = true; } } diff --git a/MusicPlayer2/SongDataManager.h b/MusicPlayer2/SongDataManager.h index 99d22902..83a818de 100644 --- a/MusicPlayer2/SongDataManager.h +++ b/MusicPlayer2/SongDataManager.h @@ -49,6 +49,9 @@ class CSongDataManager // 创建旧媒体库条目的新路径副本(不能用于cue文件) void ChangeFilePath(const wstring& file_path, const wstring& new_path); + //将一个曲目信息更新到m_song_file_name_map中 + void UpdateFileNameMap(const SongInfo& song); + //如果file_path不存在,则从媒体库中查找文件名相同的最佳匹配的项目,并将file_path更改为正确的路径 bool FixWrongFilePath(wstring& file_path) const; @@ -63,5 +66,5 @@ class CSongDataManager CString m_data_version; // 用于保证m_song_data读写的线程安全,遍历/查找加读锁,添加/删除加写锁 mutable std::shared_mutex m_shared_mutex; // 线程同步对象 - std::unordered_map> m_song_file_name_map; //保存文件名与SongInfo对象的对应关系 + std::unordered_map> m_song_file_name_map; //保存文件名与文件路径的对应关系(用于播放列表“修复错误的文件路径”功能) };