From f7433f809cc092ecad123577fafe3d9a78328f22 Mon Sep 17 00:00:00 2001 From: lrisora <43085437+lrisora@users.noreply.github.com> Date: Mon, 10 May 2021 03:14:03 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=93=E8=BE=91?= =?UTF-8?q?=E5=B0=81=E9=9D=A2=E4=BD=BF=E7=94=A8=E5=A4=96=E9=83=A8=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=96=87=E4=BB=B6=E5=90=8D=E6=97=B6=E7=9A=84=E7=9B=B8?= =?UTF-8?q?=E5=AF=B9=E8=B7=AF=E5=BE=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MusicPlayer2/AppearanceSettingDlg.cpp | 13 ++++++++++++- MusicPlayer2/MusicPlayerCmdHelper.cpp | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/MusicPlayer2/AppearanceSettingDlg.cpp b/MusicPlayer2/AppearanceSettingDlg.cpp index 8dba9577..7e43985c 100644 --- a/MusicPlayer2/AppearanceSettingDlg.cpp +++ b/MusicPlayer2/AppearanceSettingDlg.cpp @@ -455,8 +455,19 @@ void CAppearanceSettingDlg::OnOK() CString temp; GetDlgItemText(IDC_DEFAULT_COVER_NAME_EDIT, temp); + temp.Replace(L'/', L'\\'); CCommon::StringSplit(wstring(temp), L',', m_data.default_album_name); - + for (auto& album_name : m_data.default_album_name) + { + // 虽然开头的.\\不是后续识别必须的但是如果发现缺少还是加上 + if (album_name.find(L'\\') != wstring::npos) // 这是一个相对路径 + { + // 有正常的相对路径开头 + if (album_name.at(0) == L'.' && album_name.at(1) == L'\\') + continue; + album_name = L".\\" + album_name; + } + } m_data.ui_refresh_interval = m_ui_refresh_interval_edit.GetValue(); //CTabDlg::OnOK(); diff --git a/MusicPlayer2/MusicPlayerCmdHelper.cpp b/MusicPlayer2/MusicPlayerCmdHelper.cpp index ddc6b9d8..935981fe 100644 --- a/MusicPlayer2/MusicPlayerCmdHelper.cpp +++ b/MusicPlayer2/MusicPlayerCmdHelper.cpp @@ -442,17 +442,27 @@ std::wstring CMusicPlayerCmdHelper::SearchAlbumCover(const SongInfo& song) CCommon::GetImageFiles(file_name, files); } //没有找到唱片集为文件名的文件,查找文件名为设置的专辑封面名的文件 - if (theApp.m_app_setting_data.use_out_image) + if (theApp.m_app_setting_data.use_out_image && files.empty()) { for (const auto& album_name : theApp.m_app_setting_data.default_album_name) { - if (!files.empty()) - break; if (!album_name.empty()) { file_name = dir + album_name + L".*"; CCommon::GetImageFiles(file_name, files); } + if (!files.empty()) + { + // 处理album_name可能含有相对路径的情况,files[0]仅有文件名 + size_t index; + index = album_name.rfind('\\'); + if (index != wstring::npos) + { + // 由于album_name可能含有通配符所以不能只替换后缀,需要替换整个文件名 + files[0] = album_name.substr(0, index + 1) + files[0]; + } + break; + } } } if (!files.empty()) From b4524f395b3ffb90fa431975aeaf9ec1fb9e6e8f Mon Sep 17 00:00:00 2001 From: lrisora <43085437+lrisora@users.noreply.github.com> Date: Tue, 11 May 2021 02:49:18 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A4=96=E9=83=A8=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=90=8D=E7=9B=B8=E5=AF=B9=E8=B7=AF=E5=BE=84=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E6=94=B9=E7=94=A8RelativeP?= =?UTF-8?q?athToAbsolutePath?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MusicPlayer2/AppearanceSettingDlg.cpp | 4 ++-- MusicPlayer2/Common.cpp | 6 ++++-- MusicPlayer2/MusicPlayerCmdHelper.cpp | 19 ++++++++++--------- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/MusicPlayer2/AppearanceSettingDlg.cpp b/MusicPlayer2/AppearanceSettingDlg.cpp index 7e43985c..87ee72da 100644 --- a/MusicPlayer2/AppearanceSettingDlg.cpp +++ b/MusicPlayer2/AppearanceSettingDlg.cpp @@ -460,9 +460,9 @@ void CAppearanceSettingDlg::OnOK() for (auto& album_name : m_data.default_album_name) { // 虽然开头的.\\不是后续识别必须的但是如果发现缺少还是加上 - if (album_name.find(L'\\') != wstring::npos) // 这是一个相对路径 + if (album_name.find(L'\\') != wstring::npos && album_name.front() != L'\\') // 这是一个非简写的相对路径 { - // 有正常的相对路径开头 + // 确保相对路径以".\\"开头 if (album_name.at(0) == L'.' && album_name.at(1) == L'\\') continue; album_name = L".\\" + album_name; diff --git a/MusicPlayer2/Common.cpp b/MusicPlayer2/Common.cpp index 53f73a7a..cdd00357 100644 --- a/MusicPlayer2/Common.cpp +++ b/MusicPlayer2/Common.cpp @@ -758,10 +758,12 @@ _tstring CCommon::FileRename(const _tstring& file_path, const _tstring& new_file _tstring CCommon::RelativePathToAbsolutePath(const _tstring & relative_path, const _tstring & cur_dir) { - // + // relative_path如果是绝对路径那么返回此绝对路径 + // 否则将relative_path视为相对路径并试着与cur_dir正确拼接 _tstring result = relative_path; _tstring dir = cur_dir; - if (dir.empty() || dir.back() != _T('\\') || dir.back() != _T('/')) + // 如果dir不为空那么确保dir结尾有路径分隔符 + if (!dir.empty() && (dir.back() != _T('\\') || dir.back() != _T('/'))) dir.push_back(_T('\\')); if ((result.size() > 0 && (result.front() == _T('.') || result.front() == _T('\\') || result.front() == _T('/')))) //如果是相对路径 { diff --git a/MusicPlayer2/MusicPlayerCmdHelper.cpp b/MusicPlayer2/MusicPlayerCmdHelper.cpp index 935981fe..5133fb7a 100644 --- a/MusicPlayer2/MusicPlayerCmdHelper.cpp +++ b/MusicPlayer2/MusicPlayerCmdHelper.cpp @@ -441,8 +441,10 @@ std::wstring CMusicPlayerCmdHelper::SearchAlbumCover(const SongInfo& song) file_name = dir + album_name + L".*"; CCommon::GetImageFiles(file_name, files); } - //没有找到唱片集为文件名的文件,查找文件名为设置的专辑封面名的文件 - if (theApp.m_app_setting_data.use_out_image && files.empty()) + if (!files.empty()) + album_cover_path = dir + files[0]; + // 没有找到唱片集为文件名的文件,查找文件名为设置的专辑封面名的文件 + else if (theApp.m_app_setting_data.use_out_image) { for (const auto& album_name : theApp.m_app_setting_data.default_album_name) { @@ -454,19 +456,18 @@ std::wstring CMusicPlayerCmdHelper::SearchAlbumCover(const SongInfo& song) if (!files.empty()) { // 处理album_name可能含有相对路径的情况,files[0]仅有文件名 + // 由于album_name中文件名部分可能含有通配符所以不能只替换后缀,需要替换整个文件名 + // 如果album_name是简写则处理不变,若是相对路径则拼接整理交给RelativePathToAbsolutePath进行 size_t index; index = album_name.rfind('\\'); - if (index != wstring::npos) - { - // 由于album_name可能含有通配符所以不能只替换后缀,需要替换整个文件名 - files[0] = album_name.substr(0, index + 1) + files[0]; - } + if (index == wstring::npos) + album_cover_path = dir + files[0]; + else + album_cover_path = CCommon::RelativePathToAbsolutePath(album_name.substr(0, index + 1) + files[0], dir); break; } } } - if (!files.empty()) - album_cover_path = dir + files[0]; } return album_cover_path; } From 74bd2247f2f3f62a80e926aa6830a73ef984d862 Mon Sep 17 00:00:00 2001 From: lrisora <43085437+lrisora@users.noreply.github.com> Date: Tue, 11 May 2021 12:10:15 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9RelativePathToAbsolutePat?= =?UTF-8?q?h=E5=AE=9E=E7=8E=B0=E4=B8=BAwin32API=20PathCombine=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5=E7=AE=80=E5=8C=96=E6=9C=80=E7=BB=88=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MusicPlayer2/Common.cpp | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/MusicPlayer2/Common.cpp b/MusicPlayer2/Common.cpp index cdd00357..0c32283e 100644 --- a/MusicPlayer2/Common.cpp +++ b/MusicPlayer2/Common.cpp @@ -4,6 +4,7 @@ #include "FilePathHelper.h" #include #include +// #include CCommon::CCommon() { @@ -758,24 +759,19 @@ _tstring CCommon::FileRename(const _tstring& file_path, const _tstring& new_file _tstring CCommon::RelativePathToAbsolutePath(const _tstring & relative_path, const _tstring & cur_dir) { - // relative_path如果是绝对路径那么返回此绝对路径 - // 否则将relative_path视为相对路径并试着与cur_dir正确拼接 + // relative_path如果是盘符开头的绝对路径那么返回此绝对路径 + // 否则将relative_path视为相对路径或斜杠开头的绝对路径并与cur_dir拼接 _tstring result = relative_path; _tstring dir = cur_dir; - // 如果dir不为空那么确保dir结尾有路径分隔符 - if (!dir.empty() && (dir.back() != _T('\\') || dir.back() != _T('/'))) - dir.push_back(_T('\\')); - if ((result.size() > 0 && (result.front() == _T('.') || result.front() == _T('\\') || result.front() == _T('/')))) //如果是相对路径 + if (!IsWindowsPath(result) && !dir.empty()) { - if (result.front() == _T('.') && (result.size() == 1 || result[1] != _T('.'))) //如果路径前面是一个点而不是两个点,则把点去掉 - result = result.substr(1); - if (result.size() > 0 && (result.front() == _T('\\') || result.front() == _T('/'))) - result = result.substr(1); - result = dir + result; - } - else if (!IsWindowsPath(result)) - { - result = dir + result; + // https://docs.microsoft.com/en-us/windows/win32/api/shlwapi/ + // PathCombine拼接简化两个合法路径,当result为斜杠开头的绝对路径时将其只与dir的盘符拼接 + // PathCchCombine 是处理了缓冲区溢出的安全版本,Windows 8开始支持,位于pathcch.h + TCHAR lpBuffer[MAX_PATH]{}; + PathCombine(lpBuffer, dir.c_str(), result.c_str()); + // PathCchCombine(lpBuffer, MAX_PATH, dir.c_str(), result.c_str()); + result = lpBuffer; } return result; } From 683f8163eb4e928d46808a20c71eb8b384c37fd6 Mon Sep 17 00:00:00 2001 From: lrisora <43085437+lrisora@users.noreply.github.com> Date: Tue, 11 May 2021 19:15:38 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=9F=A5=E6=89=BE=EF=BC=8C=E5=A4=96=E9=83=A8?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=BB=9D=E5=AF=B9=E8=B7=AF=E5=BE=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MusicPlayer2/AppearanceSettingDlg.cpp | 3 ++- MusicPlayer2/MusicPlayerCmdHelper.cpp | 11 +++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/MusicPlayer2/AppearanceSettingDlg.cpp b/MusicPlayer2/AppearanceSettingDlg.cpp index 87ee72da..140181ab 100644 --- a/MusicPlayer2/AppearanceSettingDlg.cpp +++ b/MusicPlayer2/AppearanceSettingDlg.cpp @@ -460,7 +460,8 @@ void CAppearanceSettingDlg::OnOK() for (auto& album_name : m_data.default_album_name) { // 虽然开头的.\\不是后续识别必须的但是如果发现缺少还是加上 - if (album_name.find(L'\\') != wstring::npos && album_name.front() != L'\\') // 这是一个非简写的相对路径 + // 这是一个非简写的相对路径,绝对路径此处不做处理 + if (album_name.find(L'\\') != wstring::npos && album_name.front() != L'\\' && !CCommon::IsWindowsPath(album_name)) { // 确保相对路径以".\\"开头 if (album_name.at(0) == L'.' && album_name.at(1) == L'\\') diff --git a/MusicPlayer2/MusicPlayerCmdHelper.cpp b/MusicPlayer2/MusicPlayerCmdHelper.cpp index 5133fb7a..8e20f555 100644 --- a/MusicPlayer2/MusicPlayerCmdHelper.cpp +++ b/MusicPlayer2/MusicPlayerCmdHelper.cpp @@ -450,20 +450,15 @@ std::wstring CMusicPlayerCmdHelper::SearchAlbumCover(const SongInfo& song) { if (!album_name.empty()) { - file_name = dir + album_name + L".*"; + file_name = CCommon::RelativePathToAbsolutePath(album_name + L".*", dir); CCommon::GetImageFiles(file_name, files); } if (!files.empty()) { // 处理album_name可能含有相对路径的情况,files[0]仅有文件名 // 由于album_name中文件名部分可能含有通配符所以不能只替换后缀,需要替换整个文件名 - // 如果album_name是简写则处理不变,若是相对路径则拼接整理交给RelativePathToAbsolutePath进行 - size_t index; - index = album_name.rfind('\\'); - if (index == wstring::npos) - album_cover_path = dir + files[0]; - else - album_cover_path = CCommon::RelativePathToAbsolutePath(album_name.substr(0, index + 1) + files[0], dir); + size_t index = file_name.rfind('\\'); + album_cover_path = file_name.substr(0, index + 1) + files[0]; break; } }