给一个目录下的一个已存在的文件生成一个新的文件名

微软在Shlobj.h中提供了PathYetAnotherMakeUniqueName,可以直接使用。


下边是我自己编写的代码:

c:\1\1(aa).txt

c:\1\1(aa).txt不存在 -> c:\1\1(aa).txt

c:\1\1(aa).txt已存在,c:\1\1(aa) (0).txt不存在 -> c:\1\1(aa) (0).txt

c:\1\1(aa).txt已存在,c:\1\1(aa) (0).txt已存在 -> c:\1\1(aa) (1).txt


VOID ModifySaveAs(LPTSTR lpPath)
{
	LPTSTR	lpPostion				= NULL;
	LPTSTR	lpPositionPre			= NULL;
	TCHAR	NewFileName[MAX_PATH]	= {0};
	LPTSTR	lpPositionPost			= NULL;
	ULONG	ulCount					= 0;
	TCHAR	Num[MAX_PATH]			= {0};
	TCHAR	TmpFileName[MAX_PATH]	= {0};


	do 
	{
		if (!lpPath)
			break;

		// 确保保存目录存在
		lpPostion = StrRChr(lpPath, lpPath + _tcslen(lpPath), _T('\\'));
		if (!lpPostion)
			break;

		CopyMemory(NewFileName, lpPath, (lpPostion - lpPath) * sizeof(TCHAR));
		if (!PathFileExists(NewFileName))
		{
			SHCreateDirectory(NULL, NewFileName);
			break;
		}

		_tcscpy_s(TmpFileName, _countof(TmpFileName), lpPath);

		while (PathFileExists(TmpFileName))
		{
			ulCount = 0;
			lpPostion = NULL;
			lpPositionPost = NULL;
			lpPositionPre = NULL;
			ZeroMemory(Num, sizeof(Num));
			ZeroMemory(NewFileName, sizeof(NewFileName));

			lpPostion = StrRChr(TmpFileName, TmpFileName + _tcslen(TmpFileName), _T('.'));
			if (lpPostion)
				lpPostion--;
			else
				lpPostion = TmpFileName + _tcslen(TmpFileName) - 1;

			lpPositionPost = StrRChr(TmpFileName, lpPostion + 1, _T(')'));
			lpPositionPre = StrRChr(TmpFileName, lpPostion + 1, _T('('));

			if (lpPositionPre && lpPositionPost && lpPositionPre < lpPositionPost)
			{
				lpPositionPost--;
				lpPositionPre++;

				CopyMemory(NewFileName, TmpFileName, (lpPositionPre - TmpFileName) * sizeof(TCHAR));

				CopyMemory(Num, lpPositionPre, (lpPositionPost - lpPositionPre + 1) * sizeof(TCHAR));

				ulCount = StrToInt(Num);
				if (ulCount ||
					((_tcslen(Num) == 1) && ((*Num >= _T('0')) && (*Num <= _T('9')))))
				{
					ulCount++;
					StringCbPrintf(Num, sizeof(Num), _T("%d"), ulCount);
					_tcscat_s(NewFileName, Num);

					_tcscat_s(NewFileName, lpPositionPost + 1);

					ZeroMemory(TmpFileName, MAX_PATH * sizeof(TCHAR));
					_tcscpy_s(TmpFileName, MAX_PATH, NewFileName);
				}
				else
				{
					CopyMemory(NewFileName + (lpPositionPre - TmpFileName), lpPositionPre, (lpPositionPost - lpPositionPre + 2) * sizeof(TCHAR));

					_tcscat_s(NewFileName, _T(" ("));

					StringCbPrintf(Num, sizeof(Num), _T("0"));
					_tcscat_s(NewFileName, Num);

					_tcscat_s(NewFileName, _T(")"));

					_tcscat_s(NewFileName, lpPostion + 1);

					ZeroMemory(TmpFileName, MAX_PATH * sizeof(TCHAR));
					_tcscpy_s(TmpFileName, MAX_PATH, NewFileName);
				}
			}
			else
			{
				CopyMemory(NewFileName, TmpFileName, (lpPostion - TmpFileName + 1) * sizeof(TCHAR));

				_tcscat_s(NewFileName, _T(" ("));

				StringCbPrintf(Num, sizeof(Num), _T("0"));
				_tcscat_s(NewFileName, Num);

				_tcscat_s(NewFileName, _T(")"));

				_tcscat_s(NewFileName, lpPostion + 1);

				ZeroMemory(TmpFileName, MAX_PATH * sizeof(TCHAR));
				_tcscpy_s(TmpFileName, MAX_PATH, NewFileName);
			}
		}

		CopyMemory(lpPath, TmpFileName, _tcslen(TmpFileName) * sizeof(TCHAR));
		*(lpPath + _tcslen(TmpFileName)) = _T('\0');
	} while (FALSE);

	return;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值