求批量修改文件名的程序?

xixia07m 2018-09-12 08:05:54



如上图所示选择了文件类型后,点击“选择路径”,选择了一个文件夹,然后在列表控件中显示搜到的文件名,想把这些文件名后面添加一个密级,像0: 不改名;1:“公开”等,举例:上下拉电阻的作用.pdf变成上下拉电阻的作用(公开).pdf,让操作者在选择了Combox 下拉列表控件的某一项之后,点击“重命名”按钮后,实现如上的操作。这里还有一个要求就是搜出来文件后,把所有的文件的文件名都修改喽,之后根据需要多选某些特定的文件名,实现对这些文件的文件名的标密,请问实现这些功能应该怎么编程?
...全文
644 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixia07m 2018-09-30
  • 打赏
  • 举报
回复
请指点,多谢了。
赵4老师 2018-09-30
  • 打赏
  • 举报
回复
好压软件似乎自带批处理改名功能。
xixia07m 2018-09-18
  • 打赏
  • 举报
回复
对,您说的对,CString是变量类型,我就是想知道这两段程序中的同样变量类型的同名变量,用起来有没有冲突?

rename前,我选择mComeboBox的下拉框的选项了,但是Rename后就是没显示XXX(公开).pdf,XXX(秘密).doc等类似的标密文件。

检查 cmbName 是否 空 : if(cmbName.IsEmpty()) return CString(错误);有什么用?
schlafenhamster 2018-09-18
  • 打赏
  • 举报
回复
"这两段程序中都有CString变量,变量相同,有没有冲突啊"
概念错误 !
CString变量 ! CString 是 某变量 的 类型,不是 变量 , 如 int 是 整数 类型, 不是 整数 变量 !


mComeboBox.GetWindowText(cmbName);
检查 cmbName 是否 空 : if(cmbName.IsEmpty()) return CString(错误);

在 rename 前 要 选择 mComeboBox
schlafenhamster 2018-09-18
  • 打赏
  • 举报
回复
CString time; time 是 预定义 类型 。改为
CString tm;
schlafenhamster 2018-09-18
  • 打赏
  • 举报
回复
两段程序中的同样变量类型的同名变量
这是 变量的作用域的 问题 ,某段程序 中 的变量 ,只在 该 程序 有用 (通常 变量在 栈 中!), 出 这个 程序 就
没用了 , 单 同一段 函数中 ,变量不能 同名 ! 这是 变量的唯一性 (编译器 会报警)
schlafenhamster 2018-09-17
  • 打赏
  • 举报
回复
不必,这是取当前选择项,与 当前选择项改变 无关。
因为 CString sl=GetSecurityLevel(); 是第一句 (不在while内),以后所有list的多选项 会用同一个 密级 改名
xixia07m 2018-09-17
  • 打赏
  • 举报
回复
// rename
CString CShowdirDlg::GetSecurityLevel()
{
CString cmbName;
m_Cmb1.GetWindowText(cmbName);//"1: 公开";
int at=cmbName.ReverseFind(' ');
return cmbName.Right(cmbName.GetLength()-at-1);
}
//这个函数是不是就是应该写到我VC2010程序的void XXXDlg:: OnCbnselchangeCombo()处呢?
xixia07m 2018-09-17
  • 打赏
  • 举报
回复
void CremarksecretDlg::ListShow(int pageNo)
{      
	    UINT nCount=fileList.size();   //得到控件的行数   总的文件个数。		
	    UINT i;
		//int pageNo=1;
	    Start=pageSize*(pageNo-1);
		End=pageSize*pageNo;
		CString empty;   //难道是这里定义错了?
	    CString name;
	    CString time;
	    CString fpath;
		mlist.LockWindowUpdate(); 
		mlist.DeleteAllItems();     //要想实现翻页效果这句必不可少。
	for(i=Start;i<End;i++)  //改成i=0;i<50也还是不行,这里不是逻辑出了问题,而是其它的问题。
	 {  
		if(i>=nCount)break;
		empty.Format(_T("%d"),i+1);     
		int nRow=mlist.InsertItem(i,empty);    //这句话什么意思?
		afxDump<<nRow<<"\n";    //这句对翻页没有影响
		name.Format(_T("%s\n"),fileList[i].szFileName.c_str());
		mlist.SetItemText(nRow,1,name);      //插入列   自注:从这里开始程序就不对了,这句还是对的
		time.Format(_T("%s\n"),fileList[i].szCreateTime.c_str());
	    mlist.SetItemText(nRow,2,time);
		fpath.Format(_T("%s\n"),fileList[i].szFilePath.c_str());   //不影响翻页
		mlist.SetItemText(nRow,3,fpath);
	 }
	    mlist.UnlockWindowUpdate();	
	//	getchar();
}
        

void CremarksecretDlg::OnCbnSelchangeCombo()
{
	// TODO: 在此添加控件通知处理程序代码
}



CString CremarksecretDlg::GetSecurityLevel()
{
    CString cmbName;
    mComeboBox.GetWindowText(cmbName);//"1:     公开";
    int at=cmbName.ReverseFind(' ');
    return cmbName.Right(cmbName.GetLength()-at-1);
} 

void CremarksecretDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	CString sl=GetSecurityLevel();
    POSITION pos = mlist.GetFirstSelectedItemPosition();
    int nSelectedItem = -1;
    while (pos!=NULL)
    {
        nSelectedItem = mlist.GetNextSelectedItem(pos);
        CString name  = mlist.GetItemText(nSelectedItem,1);
        CString path  = mlist.GetItemText(nSelectedItem,3);
        CString extname=name.Right(name.GetLength()-name.ReverseFind('.'));
        CString pureName=name.Left(name.ReverseFind('.'));
        CString newName=path;
        newName += "\\";
        newName += pureName;
        newName += sl;// "机密";// 增加的
        newName += extname;
        AfxMessageBox(path + "\\"+ name + " To " + newName);
//        CFile::Rename(path + "\\"+ name, newName );
    }
}

这两段程序中都有CString变量,变量相同,有没有冲突啊?我这些程序这么写被证实有问题,因为没有在文件名后面添加(公开),(内部),(秘密)等密级,请问是怎么回事。
xixia07m 2018-09-17
  • 打赏
  • 举报
回复
这里的三个错误应该如何改,请指教。
schlafenhamster 2018-09-17
  • 打赏
  • 举报
回复

// rename
CString CShowdirDlg::GetSecurityLevel()
{
CString cmbName;
m_Cmb1.GetWindowText(cmbName);//"1: 公开";
int at=cmbName.ReverseFind(' ');
return cmbName.Right(cmbName.GetLength()-at-1);
}
//
void CShowdirDlg::OnButton4()
{
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel();
POSITION pos = m_list.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = m_list.GetNextSelectedItem(pos);
CString name = m_list.GetItemText(nSelectedItem,1);
CString path = m_list.GetItemText(nSelectedItem,3);
CString extname=name.Right(name.GetLength()-name.ReverseFind('.'));
CString pureName=name.Left(name.ReverseFind('.'));
CString newName=path;
newName += "\\";
newName += pureName;
newName += sl;// "机密";// 增加的
newName += extname;
AfxMessageBox(path + "\\"+ name + " To " + newName);
// CFile::Rename(path + "\\"+ name, newName );
}
}
schlafenhamster 2018-09-17
  • 打赏
  • 举报
回复
while (pos != NULL) 是 检查 m_list 有多少 选择 项, 取出 选择项的 id。
m_list 属性应该 是 多选。
用户 操作 如下 , 移动 鼠标 在 list 界面中 选择 任意多 项,(或 再改变 密级),点击 “Rename”, 那么 这批 文件就 同时 改名 到 一个 密级。
xixia07m 2018-09-17
  • 打赏
  • 举报
回复
引用 41 楼 schlafenhamster 的回复:

// rename
CString CShowdirDlg::GetSecurityLevel()
{
CString cmbName;
m_Cmb1.GetWindowText(cmbName);//"1: 公开";
int at=cmbName.ReverseFind(' ');
return cmbName.Right(cmbName.GetLength()-at-1);
}
//
void CShowdirDlg::OnButton4()
{
// TODO: Add your control notification handler code here
CString sl=GetSecurityLevel();
POSITION pos = m_list.GetFirstSelectedItemPosition();
int nSelectedItem = -1;
while (pos != NULL)
{
nSelectedItem = m_list.GetNextSelectedItem(pos);
CString name = m_list.GetItemText(nSelectedItem,1);
CString path = m_list.GetItemText(nSelectedItem,3);
CString extname=name.Right(name.GetLength()-name.ReverseFind('.'));
CString pureName=name.Left(name.ReverseFind('.'));
CString newName=path;
newName += "\\";
newName += pureName;
newName += sl;// "机密";// 增加的
newName += extname;
AfxMessageBox(path + "\\"+ name + " To " + newName);
// CFile::Rename(path + "\\"+ name, newName );
}
}

点Combox box 控件的下拉框选项,对应这里m_Cmb1.GetWindowText(cmbName);,m_Cmb1中的GetWindowText的内容为1: 公开;2: 内部;3: 秘密........。等
还有请问:while以下的语句是什么意思,看不懂啊。
xixia07m 2018-09-17
  • 打赏
  • 举报
回复
那我自动生成的 void XXXDlg:: OnCbnselchangeCombo()声明
{
//ToD:在此添加控件通知处理程序代码
}
这里针对我需要实现的功能,需要写些什么呢?
xixia07m 2018-09-16
  • 打赏
  • 举报
回复
带点的波浪线显示了,这是什么错误?如果带着0~5的标号,应该怎么编?
schlafenhamster 2018-09-16
  • 打赏
  • 举报
回复
"m_cmb当前选择项是怎么回事"
就是用户 选择 密级,你那个 cmb 不要 1.。。。6 ,直接 就是 “机密“ 要不然 必须 去除 ‘1“ 。。。’
用户 选择 密级 后 cmb 的 edit 显示 响应 密级 如 “机密“
newName += "机密";
变成
newName += m_cmb.GetWindowText() ;//
xixia07m 2018-09-16
  • 打赏
  • 举报
回复
newName += "机密";// 增加的 这句写在“重命名”按钮的程序里,不用写在Combo box对应的程序里吗?Combo box程序与重命名按钮程序逻辑是上是怎样的联系呢?m_cmb当前选择项是怎么回事,编辑框edit程序应该怎么写?请指教。
xixia07m 2018-09-16
  • 打赏
  • 举报
回复
引用 34 楼 schlafenhamster 的回复:
CString GetSecurityLevel() { CString cmbName="1: 公开";// 5 spaces ! int at=cmbName.ReverseFind(' '); return cmbName.Right(cmbName.GetLength()-at-1); } 调用 CString sl=GetSecirityLevel();
要想得到其他的密级只需要把程序由 CString cmbName="1: 公开";// 5 spaces ! 改为CString cmbName=m_cmb.GetWindowText() ;即可,是吧?
xixia07m 2018-09-16
  • 打赏
  • 举报
回复
这个错误怎么消除?
schlafenhamster 2018-09-16
  • 打赏
  • 举报
回复
"不用对Combox box这个控件编程吗"
要 即 newName += "机密";// 增加的
是 m_cmb 当前 选择项 (m_cmb。GetWindowText(),即 其 edit 的 内容)
加载更多回复(34)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧