我的一个习作,文件名批量转换器[仿国华批量改名器][含源码]

C#程序实现批量重命名功能 C#(读作“看”或“西尖”)是一种由微软开发的强类型面向对象的编程语言,它由安德斯·海尔斯伯格(Anders Hejlsberg)领导开发,于2000年随.NET Framework一起发布。C#旨在结合C++的性能和Visual Basic的易用性,使得开发者能够构建各种复杂的应用程序。文件系统是操作系统中用于管理数据的系统,它提供对数据的存储、检索、更新、共享和持久化的机制。 阅读详情

学了几天的VC++.Net终于有了这一个习作,我很喜欢用PDA看小说,有时候下载下来的网页就需要批量改名,一直用国华的这个,感觉还算好用,这两天学了VC++就寻思着仿写一个。昨晚搞定。

Version 1.5

源代码

EXE Release

在这里记下几个开发中的问题。

第一个问题:目录树

国华的那个目录树很难看,不是XP风格,我自己写目录树的时候查了好多地方终于下载到一个DirTreeDemo有人家写好的CDirTreeCtrl,继承自CTreeCtrl很不错,可惜注释有很多地方是德语,偶看不懂,研究了好久,终于能用了。主要接口如下:

public:
 BOOL SetSelPath( LPCTSTR strPath );//设置当前目录为strPath
 CString GetFullPath( HTREEITEM hItem );//得到hItem的路径
 LPCTSTR GetSubPath( LPCTSTR strPath );//(没用到,没研究,汗)
 BOOL DisplayTree( LPCTSTR strRoot, BOOL bFiles = FALSE );//显示整个目录树strRoot为根目录输入NULL则显示本机所有Drives,bFiles为TRUE则显示文件否则只显示目录。

主要文件四个:DirTreeCtrl.H,DirTreeCtrl.CPP,SortStringArray.CPP,SortStringArray.H

第二个问题:ComboBox用于用户输入或选择扩展名

我靠,这个东东居然搞了我好几个小时,真是晕死。本以为ComboBox的Edit 和List的句柄很好拿结果我用COMBOBOXINFO结构vs居然告诉我未声明的标识符,我明明Include了winuser.h和windows.h了啊。最后还是用GetWindowText解决问题,ComboBox的Edit和List的句柄就是拿不到,哪位大虾指教一下。

第三个问题:ListBox的横向滚动条

直接从MSDN拷贝的代码,效率不是最好,但是目前这个程序里比较够用。

void CMyRenamerDlg::ListHScroll(void)
{
  CListBox* pmyListBox;//指向自己的ListBox的指针

 pmyListBox = &m_FileList;
 // Find the longest string in the list box.
 CString      str;
 CSize      sz;
 int      dx = 0;
 TEXTMETRIC   tm;
 CDC*  pDC = pmyListBox->GetDC();
 CFont*      pFont = pmyListBox->GetFont();

 // Select the listbox font, save the old font
 CFont* pOldFont = pDC->SelectObject(pFont);
 // Get the text metrics for avg char width
 pDC->GetTextMetrics(&tm);

 for (int i = 0; i < pmyListBox->GetCount(); i++)
 {
  pmyListBox->GetText(i, str);
 sz = pDC->GetTextExtent(str);

 // Add the avg width to prevent clipping
 sz.cx += tm.tmAveCharWidth;

 if (sz.cx > dx)
    dx = sz.cx;
 }
 // Select the old font back into the DC
 pDC->SelectObject(pOldFont);
 pmyListBox->ReleaseDC(pDC);

 // Set the horizontal extent so every character of all strings
 // can be scrolled to.
 pmyListBox->SetHorizontalExtent(dx);//设置横向滚动条宽度,以像素为单位

}

第四个问题:搜索一个目录下的符合多个通配的文件

主要三点

1  用CString的Tokenize分离多个通配字符串,以";"分隔

2 CFileFind类按通配查找文件

3 显示在ListBox中

void CMyRenamerDlg::DisplayFile(CString &strPath)
{
  CFileFind finder;
  CString szPath;
  if (m_strExt == "")
   m_strExt = "*.*";
  CString resToken;
  int curPos= 0;

  resToken= m_strExt.Tokenize(";",curPos);
  m_FileList.ResetContent();
  while (resToken != "")
  {
   szPath = strPath + "//"+resToken;
   BOOL bWorking = finder.FindFile(szPath);
   while (bWorking)
   {
    bWorking = finder.FindNextFile();
    if (!finder.IsDirectory())
    {
     m_FileList.AddString(finder.GetFileName());
    }
   }
  resToken= m_strExt.Tokenize(";",curPos);
 };
 ListHScroll();
}

第五个问题:根据选项批量修改文件名

void CMyRenamerDlg::OnBnClickedButtonModify()
{
 // TODO: 在此添加控件通知处理程序代码
 UpdateData(TRUE);
 int affirm = AfxMessageBox("即将更改全部选定文件名,你确认要这样做吗?",MB_OKCANCEL);
 if (affirm == IDCANCEL)
  return;
 int nCount = m_FileList.GetSelCount();
 CArray<int,int> aryListBoxSel;
 CString str;
 CString oldStr;
 CString oldPath;
 CString newPath;

 aryListBoxSel.SetSize(nCount);
 m_FileList.GetSelItems(nCount, aryListBoxSel.GetData());
 for (int i=0;i<aryListBoxSel.GetCount();i++)
 {
  m_intNum = 1 + i * m_intIncrement;
  m_FileList.GetText(aryListBoxSel[i],str);
  oldStr = str;
  ModifyFileName(str);
  if ((str[0] != '.')&&(str != ""))
  {
   oldPath = m_strCurPath + '//'+oldStr;
   newPath = m_strCurPath + '//'+str;
   CFile::Rename(oldPath,newPath);
  }
 }
 DisplayFile(m_strCurPath);
 UpdateData(FALSE);
}

void CMyRenamerDlg::ModifyFileName(CString & strFileName)
{
 UpdateData(TRUE);
 int pos = strFileName.ReverseFind('.');
 CString title,
   extension("");
 if (pos == -1)
  title = strFileName;
 else
 {
  title = strFileName.Left(pos);
  extension = strFileName.Right(strFileName.GetLength()-pos-1);
 }

 switch (m_radToModify)
 {
 case 0:
  ModifyFileTitle(title);
  break;
 case 1:
  ModifyFileExt(extension);
  break;
 case 2:
  ModifyFileTitle(title);
  ModifyFileExt(extension);
  break;
 }
 if (extension != "")
  strFileName = title + '.'+extension;
 else
  strFileName = title;
}

void CMyRenamerDlg::ModifyFileTitle(CString& title)
{
 CString strNum;
 strNum.Format("%d",m_intNum);
 int pos;
 switch (m_radPreMode)
 {
 case 0:
  title = m_strNewPre + strNum;
  break;
 case 1:
  if (m_chkNoIncrement)
   title = m_strNewPre + title;
  else
   title = m_strNewPre + strNum + title;
  break;
 case 2:
  if (m_chkNoIncrement)
   title = title + m_strNewPre;
  else
   title = title + m_strNewPre + strNum;
  break;
 case 3:
  pos = title.Find(m_strNewPre);
  if (pos != -1)
   title.Delete(pos,m_strNewPre.GetLength());
  break;
 }
}

void CMyRenamerDlg::ModifyFileExt(CString& extension)
{
 switch (m_radExtMode)
 {
 case 0:
  extension = m_strNewExt;
  break;
 case 1:
  extension = m_strNewExt + extension;
  break;
 case 2:
  extension = extension + m_strNewExt;
 }
}

c++用mfc实现的文件系统 c++ mfc 文件系统 源代码 直接可以运行 立即下载

相关推荐

经典角点代码,vc实现

vc实现经典角点代码,vc实现经典角点代码

CTreeCtrl添加图标几种方法

ASSERT(pmyTreeCtrl-> GetImageList(TVSIL_NORMAL)   ==   NULL);  pmyTreeCtrl-> SetImageList(pmyImageList,   TVSIL_NORMAL);  ASSERT(pmyTreeCtrl-> GetImageList(TVSIL_NORMAL)   ==   pmyImageList)

无为小青年6的专栏 4844

CDirTreeCtrl_demo.rar

VC++6.0编写程序,供参考学习带复选框树控件程序的开发

【代码备忘】MFC遍历文件夹、删除文件夹、CTreeCtrl使用方法

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!158427611  所贴代码皆有一些工程代码,会对应标出! 【遍历文件夹 & CtreeCtrl插入节点】 void CDirTraversal::FindDir(HTREEITEM pItem , const CString &dirPath )//HTREEITEM 为一个Ctre

木心[ mx1024 ] 欢迎 2062

C#批量修改文件名称

C#批量修改文件名称,使用Regex查找提定目录文件名,并根据条件进行修改

C#批量文件改名

C#写的一个批量改名软件 有源代码 主要是方便批量修改文件名 比如把字幕文件改成和视频对应的名字,播放器就能自动识别啦

树控件类

#include "stdafx.h"#include "DirTreeCtrl.h" IMPLEMENT_DYNAMIC(CDirTreeCtrl, CTreeCtrl) // CDirTreeCtrl message handlers CDirTreeCtrl::CDirTreeCtrl() { } CDirTreeCtrl::~CDirTreeCtrl() { m_imgList.De

remington2的专栏 683

c# 简易批量文件改名(重命名)源程序

需要下载资源,因此需要1积分,望大家见谅

目录树 转 ctreectrl

<br />前面发了一个用MFC类Ctreectrl实现的目录树,引来了很多搜索,不过后来发现代码效率比较低,在展开文件很多的文件夹时非常慢,这里整合了目录树类..优化了展开部分的代码..其实差不多完全不同了(也是在别人的代码上改的)。<br />先发效果图:<br />还不知道怎么同时显示checkbox和系统图标...太水了...<br />不带checkbox的:<br /><br />带checkbox的:<br /><br /><br />下面是调用部分代码:<br />    //pStatic

feihuadao的专栏 1668

KDD 2025 | 人大团队提出多任务贝叶斯联邦学习算法,同时处理分类和回归

©PaperWeekly 原创 ·作者 |吕俊良单位 |中国人民大学统计学院本文介绍了中国人民大学统计学院的一篇关于多任务贝叶斯联邦学习的文章“Task Diversity in Bayesian Federated Learning: Simultaneous Processing of Classification and Regression”,本文被 KDD 2025 接收,代码已经...

Paper weekly 2746

【仓颉 + 鸿蒙 + AI Agent】CangjieMagic框架(3):Agent请求和响应

CangjieMagic框架:使用华为仓颉编程语言编写,专门用于开发AI Agent,支持鸿蒙、Windows、macOS、Linux等系统。这篇文章剖析一下 CangjieMagic 框架中的 AgentRequest 和 AgentResponse。

九丘教育官方博客 1475

轻松实现类VC界面并加上目录树

下图是一个类似VC的界面,左边、底下有两个可浮动、可变大小的控制窗口。许多朋友都希望在自己的程序中实现类似的界面,因为此种类型的界面用途很广、通用性很强,所以笔者总结了一下实现的步骤,辑此一文,并提供源代码供大家参考!一、实现原理图中两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingCont

smallball 4010

声纹识别实战:用Python从零搭建一个简易声纹验证系统(附完整代码)

本文是一份详细的声纹识别实战指南,教你使用Python从零搭建一个简易的声纹验证系统。文章涵盖了从音频采集、预处理、MFCC特征提取,到基于高斯混合模型(GMM)的建模与验证全流程,并提供了完整的代码实现,帮助开发者快速掌握这项生物特征识别核心技术。

ik6789012的博客 234

C#实现批量修改文件名2

主要是字符串操作和文件读写。

u012062079的博客 525

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4345

YOLO11全网首发:CVPR2026 Transformer注意力 | BinaryAttention 1-bit注意力,推理提速100%,超越FlashAttention2

本文改进:BinaryAttention 结合YOLO11的C3k2模块,全网首发创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 856

C# 快速批量更改同一变量名

选中需要修改的变量名,连按两次【Ctrl+R】,然后修改变量名即可。 示例: 1.统一修改如下代码段中的变量名“Read_Stream”,共四处,见高亮位置。 2. 选中该变量名,连按两次【Ctrl+R】,出现下图所示画面。 3. 直接输入想要更改的新变量名,这里是“NewName”。 4. 按回车键,或点击右上角窗口中的“Apply”即可完成。 ...

欢迎关注,共同进步! 9072

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

【k8s故障处理篇】calico-node启动失败“Felix is not live: Get “http://localhost:9099/liveness” 解决办法(V1.30.3版本)

jks212454的博客 1091

图片批量重命名方法(排序,或者不排序)

1.效果图 2.先下载2345好压,是个好东西,设置一下 打钩 3.全选图片,右键----》批量修改文件名 . 转载于:https://www.cnblogs.com/roseY/p/10270916.html...

dianshe9581的博客 4243

组合预测 | Python实现LSTM-XGBoost长短期记忆网络组合极限梯度提升树股票价格预测

组合预测 | Python实现LSTM-XGBoost长短期记忆网络和极限梯度提升树股票价格预测

机器学习之心的博客,关注并私信文章链接,获取对应文章源码和数据。 2353

【MATLAB】通过计算曲率和曲率变化率来实现对曲线波浪程度

这段代码将计算给定曲线的曲率,并与给定阈值进行比较以检测拐角。函数是MATLAB中一个常用的函数,可以用于计算曲线在每个点处的曲率。它基于一种被称为“local least squares fitting” 的方法,通过拟合每个点周围的一小段曲线来计算曲率。MATLAB中可以使用多种方法实现拐角检测,其中一种方法是基于曲率半径的算法。该算法通过计算曲线上每个点处的曲率半径,找到拐角和弯曲处。是一个可选参数,用于控制拟合曲线的平滑度,取值范围为0到1,越接近1表示曲线越平滑。表示曲线在每个点处的曲率,

Fanjufei的博客 1919

C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?

第17课:用大白话讲清 list 的双向链表结构、哨兵头、push_back 四步、迭代器封装、merge 与 splice 的区别,以及 vector 排序为什么常比 list 快。

wo_jack的博客 237

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【C++】【STL】list_OJ题

本文系统解析了8道C++链表经典OJ题,按“算数操作”与“指针重连”分为两组,强调指针操作与数据结构解耦的重要性。通过手写ListNode、std::list及带头双向循环链表三类载体验证算法普适性,重点剖析空链、单节点、全相同值等6类边界情况,并给出统一编译与调试方案(g++11 + -Wall -O2),确保零告警、可追踪。所有题目时间复杂度均为O(N),常数差异源于遍历次数与操作开销,代码实现兼顾正确性与面试可用性。

这里是Cocatrice的博客,感谢大家一直以来的支持和鼓励,如果对C/C++方向感兴趣的话,可以通过主页的微信名片加Cocatrice的好友,也可以通过邮箱:Chen31980094@163.com 联系,一同加油! 455

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 一个C++语法问题。
rayle
博客等级 码龄24年 0粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值