posted at 2016-01-07 14:34:48 +0000
今天在整理Google Keep的时候发现了一个很早之前的笔记,是关于Windows下列举指定目录下的文件的。
后面找了找相应的项目,还好我没有删掉 ^_^
我这个程序是用来批量修改指定目录下文本文件,准确的说,ASCII码文件内容的。
不过呢,大家可以把这个扩展成批量修改指定目录下所有文件名,实现linux里面rename的效果。
关于列举目录呢,我们主要用到下面这个命令行:
dir /s /b /a:-d
/s:显示指定目录和所有子目录中的文件
/b:使用空格式,即没有标题信息或摘要。因为我们要的是指定目录下所有文件及其路径,所以这个非 常重要!
/a:显示具有指定属性的文件,其中-表示否,即不显示-之后的指定类型。
/a中分别用d,r,h,a,s,i,l表示目录,只读文件,隐藏文件,准备存档的文件,系统文件,无内容 索引文件,解析点
不过呢,上面我们的确列出了指定目录下的所有文件及其路径,但是我们要处理这些数据的话
首先得让程序得到这些数据,所以我们需要把控制台的输出流重新定向到文件或者我们的程序。
命令如下:
dir /s /b /a:-d >> g:\TreeResult.txt
接下来我们的程序只需要处理TreeResult.txt文件内容即可。
最后呢,我们就得到了一个可以列举任意指定目录下文件的控制台命令集
下面这行用来指定盘符 g:
指定文件夹,即父目录
cd \sc
枚举并输出到文件
dir /s /b /a:-d >> g:\TreeResult.txt
然后,在我之前的那个程序里面,每次要进行替换的时候,我通过在程序目录下创建一个bat文件
将上面那几行命令写入bat,然后运行bat文件,等待清单建立。代码如下:
(下面是MFC实现)
//得到可执行文件路径
TCHAR szFilePath[MAX_PATH + 1] = {0};
GetModuleFileName(NULL, szFilePath, MAX_PATH);
(_tcsrchr(szFilePath, _T('\\')))[1] = 0;
//删除文件名,只获得路径字串
CString exePath = szFilePath;
ListDir.Open(exePath + _T("//list.bat"), CFile::modeCreate | CFile::modeReadWrite);
ListDir.WriteString(dir.Left(dir.Find(_T(":")) + 1) + _T("\r\n"));
//指定盘符
ListDir.WriteString(_T("cd ") + dir.Right(dir.GetLength() - dir.Find(_T(":")) - 1) + _T("\r\n"));
//指定文件夹路径
ListDir.WriteString(_T("dir /s /b /a:-d >> c:\\TreeResult.txt\r\n"));
//执行枚举
ListDir.Close();
© kanch
→ zl AT kanchz DOT com
last updated on 2022-07-27 01:57:54 +0000