From 6fa946c4772626c4dd9ae2b8c9cd47a023b3b86c Mon Sep 17 00:00:00 2001 From: Mari Sano Date: Mon, 2 Nov 2020 18:25:04 +0900 Subject: [PATCH] =?UTF-8?q?#1449=E3=82=92=E8=A8=82=E6=AD=A3=E3=81=97?= =?UTF-8?q?=E3=81=A6ADS=E3=82=92=E4=BD=BF=E3=81=88=E3=82=8B=E3=81=AB?= =?UTF-8?q?=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sakura_core/util/file.cpp | 12 +++++++----- tests/unittests/test-ccommandline.cpp | 2 +- tests/unittests/test-file.cpp | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/sakura_core/util/file.cpp b/sakura_core/util/file.cpp index 59cbd51653..4959191334 100644 --- a/sakura_core/util/file.cpp +++ b/sakura_core/util/file.cpp @@ -27,6 +27,9 @@ #include "StdAfx.h" #include #include "file.h" + +#include + #include "charset/CharPointer.h" #include "util/module.h" #include "util/window.h" @@ -49,12 +52,11 @@ bool fexist(LPCWSTR pszPath) */ bool IsInvalidFilenameChars( const std::wstring_view& strPath ) { - // ファイル名に使えない文字 - constexpr const wchar_t invalidFilenameChars[] = L":*?\"<>|"; + // ファイル名に使えない文字(ADSを使えるように':'は除外する) + constexpr const wchar_t invalidFilenameChars[] = L"*?\"<>|"; - // 文字列中の最後のパス区切り位置を検出してファイル名を抽出する - const auto lastPathSep = strPath.find_last_of( L"\\/" ); - const auto strFilename = lastPathSep == std::wstring_view::npos ? strPath : strPath.substr( lastPathSep + 1 ); + // 文字列中のファイル名を抽出する + std::wstring_view strFilename = ::PathFindFileNameW( strPath.data() ); // ファイル名に使えない文字が含まれる場合、trueを返す return ::wcscspn( strFilename.data(), invalidFilenameChars ) < strFilename.length(); diff --git a/tests/unittests/test-ccommandline.cpp b/tests/unittests/test-ccommandline.cpp index 50bb34ec05..380636ca24 100644 --- a/tests/unittests/test-ccommandline.cpp +++ b/tests/unittests/test-ccommandline.cpp @@ -851,8 +851,8 @@ TEST(CCommandLine, ParseFileNameIncludesInvalidFilenameChars) { // ファイル名に使えない文字 = "\\/:*?\"<>|" // このうち、\\と/はパス区切りのため実質対象外になる。 + // このうち、:は代替データストリーム(ADS)の識別記号のため対象外とする。 const std::wstring_view badNames[] = { - L"localhost:8080", L"test*.txt", L"test?.txt", L"test\".txt", diff --git a/tests/unittests/test-file.cpp b/tests/unittests/test-file.cpp index 7da0f4cf36..d5039ebe5e 100644 --- a/tests/unittests/test-file.cpp +++ b/tests/unittests/test-file.cpp @@ -49,7 +49,8 @@ TEST( file, IsInvalidFilenameChars ) EXPECT_FALSE(IsInvalidFilenameChars(L"C:\\")); EXPECT_FALSE(IsInvalidFilenameChars(L"C:/")); - EXPECT_TRUE(IsInvalidFilenameChars(L"localhost:8080")); + EXPECT_FALSE(IsInvalidFilenameChars(L"test:001.txt")); + EXPECT_TRUE(IsInvalidFilenameChars(L"test*.txt")); EXPECT_TRUE(IsInvalidFilenameChars(L"test?.txt")); EXPECT_TRUE(IsInvalidFilenameChars(L"test\".txt"));