Board logo

标题: [已结]判断文件夹并遍历文件夹的内容 [打印本页]

作者: qinqong     时间: 2006-7-18 23:45    标题: [已结]判断文件夹并遍历文件夹的内容

我想判断给的的路径是文件还是文件夹,若是文件夹,就找出它里面的所有文件和子文件夹下的文件(只需要获得文件名就行),请高手帮忙?

[ Last edited by willsort on 2006-7-22 at 19:33 ]
作者: poyexinghun     时间: 2006-7-19 03:41
这是我刚才才写的,不知道是不是你表达的意思,如不是请谅解!
如果合意,看看有什么不足,帮忙改一下,共同学习!

set input=                                           echo 初始化变量为空
set /p input=                                       echo 需要用户输入文件夹名
if %input% =='' exit                             echo 如果用户输入为空则退出
dir /b/s %input% >c.txt                        echo 查找文件夹的完整路径写入文件
for /f %%i in (c.txt) do dir %%i >c.txt    echo 将查看子目录的信息写入到文件
more c.txt                                           echo 浏览文件信息即子目录信息
del c.txt                                              echo 删除文件
pause                                                  echo 退出

[ Last edited by poyexinghun on 2006-7-19 at 04:13 ]
作者: qinqong     时间: 2006-7-19 10:18
谢谢了,我很长时间没用DOS了,手有点生了。
作者: namejm     时间: 2006-7-19 13:09
  2楼的并不能解决问题,并且echo及其之后的内容是错误的注释格式。

  以下代码在XP下测试通过。
@echo off
if exist list.txt del list.txt /q
:input
cls
set input=:
set /p input=           请输入要进行判断的路径:
set "input=%input:"=%"
:: 上面这句为判断%input%中是否存在引号,有则剔除。
if "%input%"==":" goto input
if not exist "%input%" goto input
for %%i in ("%input%") do if /i "%%~di"==%%i goto input
pushd %cd%
cd /d "%input%">nul 2>nul || exit
set cur_dir=%cd%
popd
for /f "delims=" %%i in ('dir /b /a-d /s "%input%"') do echo %%~nxi>>list.txt
if not exist list.txt goto no_file
start list.txt
exit

:no_file
cls
echo       %cur_dir% 文件夹下没有单独的文件
pause
[ Last edited by namejm on 2006-7-20 at 11:04 ]
作者: poyexinghun     时间: 2006-7-19 13:39
谢谢!
小弟初学,不知道规范,以后还请各位多多指教!

运行了兄的代码,提点见意!(讨论学习吗?)
兄的代码可行性比较好,就是灵活性不是很好。
例:
   e:\downloads\miusc\mp3
如果只输入mp3就能查到文件夹的所有信息不是更好?
不知兄认为如何?
作者: namejm     时间: 2006-7-19 13:52
Re poyexinghun:

  呵呵,4楼的代码只是应楼主的要求而写,能满足楼主的需要就够了,我不能画蛇添足地来一些楼主没提到的功能啊。

  如果想查找文件夹的一些信息,也不是不能办到,不过有些可能做不到。如果你想要的话,请说明你想显示文件夹的什么信息,看CMD或者我能不能办到:)

  代码的规范问题,初学的时候都会犯一些错误,以前我也好不到哪里去,多写一些就顺手了。呵呵,共同进步吧。
作者: willsort     时间: 2006-7-19 14:08
Re namejm:

      不错的代码!不过再提几点个人意见。

      1、根据程序的结构看,&& goto list 和 :list 标签是可以省略的。

      2、根路径可以不用设置,因为已经是当前路径了。

      3、获取目录名可以联合使用 /r /d ,它不会列出指定的根路径;或者使用%%~fi,这样就不用使用 set 来截去路径中的\.了。

      这一点楼主的描述有问题,让人无法确定是想获得文件还是文件夹的名字,我认为前者的可能性大些,也就是说“文件夹”是“文件名”的讹误。

Re poyexinghun:

      只要当前路径是e:\downloads\miusc,那么输入mp3后,namejm熊的代码是可以获得mp3下所有子文件夹信息的。
作者: namejm     时间: 2006-7-19 19:37
Re willsort:

  1、&& goto list 和 :list 确实可以省略,当初只是按思路把想到的都写出来,没考虑到代码的精简;

  2、当初写这段代码的时候,想到应该把它放到任意位置都可以对指定的文件夹进行操作,而不仅仅对bat所在的文件夹进行操作,所以,我觉得对根路径还是要进行判断,以免错误地输入了根路径;

  3、发现用dir来操作更容易一点,于是放弃了for语句,不再考虑是否要截取\.的问题了;

  改动后的代码能生成绝对路径和相对路径,可任意选择适合的结果。
作者: namejm     时间: 2006-7-20 10:39
  呵呵,当时看得潦草,现在再认真看了一下楼主的描述,原来是要找文件夹下的所有文件(包括子文件夹下的)而不是文件夹,我理解反了:(
  要实现这个目的的话,把dir /ad改成dir /a-d就可以了,但是楼主只要文件名就够了,不需要相对路径,这个得再想个法子,可能还是不能用dir而用for中的%~fi了,我再想想。

[ Last edited by namejm on 2006-7-20 at 10:43 ]
作者: namejm     时间: 2006-7-20 11:03
  稍作改动,应该符合楼主的要求了。
作者: qinqong     时间: 2006-7-21 12:46
问题已解决,多谢兄弟们了
作者: jubailan     时间: 2007-6-18 22:46
4 楼  的不错阿,学到了挺多东西