diff --git a/GUI.cpp b/GUI.cpp index 942e468..4cbe476 100644 --- a/GUI.cpp +++ b/GUI.cpp @@ -2900,24 +2900,50 @@ BOOL __fastcall XgNumberingSave(HWND hwnd, BOOL bPattern) SYSTEMTIME stNow; ::GetLocalTime(&stNow); - WCHAR szPath[MAX_PATH]; XGStringW strPath, oldName; + BOOL bSameName = FALSE; for (INT iFile = 0; iFile <= 99999; ++iFile) { + // 連番ファイル名を生成する。 strPath = XgGenerateNumberingFilename(hwnd, szFormat, &stNow, iFile); - if (oldName == strPath) + if (oldName == strPath) // 前回と同じファイル名だった場合。 { - StringCchCopyW(szPath, _countof(szPath), strPath.c_str()); - XGStringW strDotExt = PathFindExtensionW(szPath); - PathRemoveExtensionW(szPath); - StringCchCatW(szPath, _countof(szPath), L"~"); - PathAddExtensionW(szPath, strDotExt.c_str()); - strPath = szPath; + bSameName = TRUE; // フラグを立てて、後で処理する。 + break; } + // ファイル名のファイルが存在すれば、終了。 if (!PathFileExistsW(strPath.c_str())) break; + // 古い名前を記憶する。 oldName = strPath; } + if (bSameName) // 同じファイル名の場合。 + { + // おそらく連番がない。 + // ファイルタイトルにチルダ(~)を追加してファイル名の重複を避けることにする。 + + // 拡張子のないファイル名を取得する。 + WCHAR szFileName[MAX_PATH]; + StringCchCopyW(szFileName, _countof(szFileName), strPath.c_str()); + XGStringW strDotExt = PathFindExtensionW(szFileName); + if (strDotExt.empty()) + strDotExt = L".xd"; + PathRemoveExtensionW(szFileName); + + // 拡張子のないファイル名にチルダ(~)と拡張子をいくつか追加して再試行する。 + for (INT iRetry = 1; iRetry < MAX_PATH; ++iRetry) + { + XGStringW strName = szFileName; + strName += XGStringW(iRetry, L'~'); // チルダを(iRetry + 1)個追加。 + strName += strDotExt.c_str(); // 拡張子を追加。 + if (!PathFileExistsW(strName.c_str())) + { + strPath = std::move(strName); + break; + } + } + } + // 保存する。 xg_strFileName = strPath; if (!XgOnSave(hwnd)) diff --git a/XgFileSettings.cpp b/XgFileSettings.cpp index 6333507..e73dff3 100644 --- a/XgFileSettings.cpp +++ b/XgFileSettings.cpp @@ -27,19 +27,27 @@ XgFileSettingsDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) hCmb2 = GetDlgItem(hwnd, cmb2); ComboBox_AddString(hCmb2, L"Crossword-%6N.xd"); ComboBox_AddString(hCmb2, L"Crossword-%Wx%H-%4N.xd"); - ComboBox_AddString(hCmb2, L"Cross-%Y%M%D-%h%m%s-%N.xd"); - ComboBox_AddString(hCmb2, L"Cross-%Y%M%D-%h%m%s-%Wx%H-%N.xd"); - ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D-%h_%m_%s-%N.xd"); - ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D-%h_%m_%s-%Wx%H-%N.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y%M%D-%h%m%s.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y%M%D-%h%m%s-%Wx%H.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y%M%D(%w)-%h%m%s.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y%M%D(%w)-%h%m%s-%Wx%H.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D-%h_%m_%s.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D-%h_%m_%s-%Wx%H.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D(%w)-%h_%m_%s.xd"); + ComboBox_AddString(hCmb2, L"Cross-%Y_%M_%D(%w)-%h_%m_%s-%Wx%H.xd"); ComboBox_SetText(hCmb2, xg_szNumberingFileName1); // 連番ファイル名2。 hCmb3 = GetDlgItem(hwnd, cmb3); - ComboBox_AddString(hCmb3, L"Pat-%6N.xd"); + ComboBox_AddString(hCmb3, L"Pattern-%6N.xd"); ComboBox_AddString(hCmb3, L"Pat-%Wx%H-%4N.xd"); - ComboBox_AddString(hCmb3, L"Pat-%Y%M%D-%h%m%s-%N.xd"); - ComboBox_AddString(hCmb3, L"Pat-%Y%M%D-%h%m%s-%Wx%H-%N.xd"); - ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D-%h_%m_%s-%N.xd"); - ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D-%h_%m_%s-%Wx%H-%N.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y%M%D-%h%m%s.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y%M%D-%h%m%s-%Wx%H.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y%M%D(%w)-%h%m%s.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y%M%D(%w)-%h%m%s-%Wx%H.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D-%h_%m_%s.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D-%h_%m_%s-%Wx%H.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D(%w)-%h_%m_%s.xd"); + ComboBox_AddString(hCmb3, L"Pat-%Y_%M_%D(%w)-%h_%m_%s-%Wx%H.xd"); ComboBox_SetText(hCmb3, xg_szNumberingFileName2); // ドラッグ&ドロップを受け付ける。 DragAcceptFiles(hwnd, TRUE);