目录
前沿
看到这个功能,有些人会有一点蒙的感觉,什么叫做复制文件时,名称自动变更呢?那么看下面的展示效果你就明白喽~
讲解
选择需要复制的文件名称,点击"复制"按钮后,对文件名进行多次复制,假设右侧列表中存在相同的名称后,在文件名称之后添加"-副本",多次复制后,只是增加副本后面的数字。
这个功能是怎么来的呢?
前一阵子,一直在复制粘贴文件,我就在想window自带的这个功能还挺好用的,那是如何实现的呢?就想尝试着试一试,就当练手了,反正最近的项目不是很忙,后来,就做了这样一个功能。
接下来,我就来讲解下是如何实现界面上这些操作的吧~
后续我会把工程链接放过来,如果有觉得看讲解麻烦的,可以直接到下面查看。
功能
1:开发环境
VS2017 + Qt5.14.2
2:界面
当前界面用到的控件信息
控件1:QListWidget
用于展示需要复制的文件名称,可以指定某个目录,从目录中读取。
控件2:QPushButton
复制按钮,选中左侧列表中的文件名之后进行复制。
控件3:QListWidget
展示复制后的文件名称。
3:复制实现
对于这么一个简单的功能来说,最最核心的也就是这部分了。
对于右侧的QListWidget控件上展示的内容,这里用一个容器存储,保证所有的文件名不重复。
容器:std::vector<std::string> m_vetCopyFilesName;
查询流程:
1:判断容器中是否存在需要复制的文件名,如果不存在说明是第一个文件信息,不处理。
2:查询到容器中存在相同的名称后,进行特殊处理
3:被查询的文件名不存在"-副本",字样时,说明是第一次复制,起名叫做"xxx-副本1";
4:被查询的文件名中存在"-副本",字样时,获取副本后面的编号,进行追加+1
5:重新组合名称的文件名,递归该函数,再次判断,直到没有重复的文件名即可。
代码实现:
bool bFind = false; //未查询到名称一致的附件信息
for (int i = 0; i < m_vetCopyFilesName.size(); i++)
{
std::string sTempFileName = m_vetCopyFilesName[i];
if (sTempFileName == sFileName)
{
//说明:是副本的副本,只需要更改名字最后一位的编号
int nPosTemp = sTempFileName.rfind(".");
std::string sSuffix = sTempFileName.substr(nPosTemp, sTempFileName.length() - nPosTemp);
//说明:名称相同,需要在后面添加副本标识
if (sTempFileName.find("-副本") != -1)
{
//获取副本个数
std::string sTempNum = sTempFileName.substr(nPosTemp - 1, 1);
int nNum = atoi(sTempNum.c_str()) + 1;
sFileName = sTempFileName.substr(0, nPosTemp - 1) + std::to_string(nNum) + sSuffix;
}
else
{
//说明:是第一个需要创建的副本
sFileName = sTempFileName.substr(0, nPosTemp) + "-副本1" + sSuffix;
}
this->JudgeUploadFilesName(sFileName);
}
}
链接
文本名复制https://download.csdn.net/download/qq_32716885/75249384
今天的更新就到这里喽~
我是糯诺诺米团,一名C++开发程序媛~