Board logo

标题: 探测某个文件夹是不是空目录的方法 [打印本页]

作者: namejm     时间: 2006-12-5 11:42    标题: 探测某个文件夹是不是空目录的方法

  有网友问我要一个探测某个文件夹下哪些子目录为空的代码,原以为用 dir 会很简单地解决掉,结果一测试,才发现原来事情并非那么简单。其间变换了几种思路,前前后后竟然花费了两个小时才把问题解决好。以下是我的解题过程:

  最开始,我以为可以先用 dir /ad /b /s 来获取所有子目录的路径,然后再通过获取 "dir /a 子目录" 的输出是否为空来判断子目录是否为空,代码如下:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    for /f %%j in ('dir /a /b "%%i"') do if "%%j"=="" echo "%%i"下没有文件
)
pause
  可是,无论我如何变换环境测试,始终不能检测到空目录,百思不得其解,于是放弃了通过检测空值来探测空目录的想法。

  改成下面的代码来查看test.txt,发现dir空目录的结果占了9行(包括空行)。
@echo off
cd.>test.txt
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /a /b /s') do >>test.txt dir /a "%%i"
start test.txt
于是想到了通过探测dir结果中信息行数的方法来探测文件夹是否为空,得到如下代码:
@echo off
set num=0
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    for /f %%j in ('dir /a "%%i"') do set /a num+=1
    if !num! lss 8 echo "%%i" 下没有文件
    set num=0
)
pause
  至此,问题得到解决。

  后来,在群里又讨论了一番,发现上面的代码还可以优化,探测文件夹目录是否为空的方案还有好几种,比如 rd 方案,copy 方案。时间关系,其中的原理暂时不多说。

[ Last edited by namejm on 2007-1-6 at 12:22 AM ]
作者: youxi01     时间: 2006-12-5 13:42
TO namejm,代码段1经检测,可能原因如下:
   for /f %%j in ('dir /a /b "%%i"') do if "%%j"=="" echo "%%i"下没有文件
以上语句当%%i为空值时,不能正常执行,因为'dir /a /b "%%i"'为空,也就是根本无%%j,也就无法实现所需结果。

当%%i为空时,类似以下代码。
测试语句:
for /f %i in () do if "%i"=="" (echo ok ) else echo no
以上代码执行时,是什么都不显示,是不是出乎意料呢?

利用findstr 可以避免这种情况:
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /ad /b /s') do (
    dir /a /b "%%i"|findstr .>nul||echo %%i
)
pause
[ Last edited by youxi01 on 2006-12-5 at 01:45 PM ]
作者: namejm     时间: 2006-12-6 00:01
  通过 findstr 来探测确实是种方法。不过,比起顶楼的代码,效率方面稍微逊色了一点,问题出在管道符号的使用上。另外,2F启用变量延迟的语句可以去掉。
作者: namejm     时间: 2007-1-6 11:35
  基于2楼的说法,得到一个更加简洁高效的代码:
@echo off
set flag=
for /f %%i in ('dir /a /b "目标文件夹"') do set flag=1
if defined flag (echo 文件夹非空) else echo 这是个空文件夹
pause
  谢谢楼下的提醒,修改了一处错误。

[ Last edited by namejm on 2007-1-6 at 12:17 AM ]
作者: qzwqzw     时间: 2007-1-6 12:39
4楼代码存在漏洞

如果不存在“目标文件夹”判断出错

如果“目标文件夹”下仅存在文件判断出错
作者: namejm     时间: 2007-1-6 13:16
  呵呵,确实有漏洞,写代码手快了一点,多加了一个参数d。

  至于不存在"目标文件夹"而出错的情况,则不应该归为漏洞,因为是要对目标文件夹进行检测,默认的前提条件是这个目标文件夹存在,属于隐性声明而不是显式声明,呵呵,套用了一下术语,关公面前耍了一次大刀。
作者: namejm     时间: 2007-1-7 07:35
  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 这里 查看),自己居然搞忘了,嘿嘿,意外收获。修改几个字符之后再发一次:
@echo off
dir /a /b "目标文件夹"|findstr .>nul&& echo 有文件 || echo 没有文件
pause

作者: dikex     时间: 2007-1-7 08:00
有的文件是没有后缀的……
作者: namejm     时间: 2007-1-7 08:09
  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没有后缀的文件照样能正确处理。
作者: dikex     时间: 2007-1-7 08:16


  Quote:
Originally posted by namejm at 2007-1-6 07:09 PM:
  点号在 findstr 命令中不是普通的字符,而是正则表达式中的特殊符号,表示任意字符的意思,和 dir 命令中的 ? 或者 * 是同样的作用:通配符。没 ...

一般很少用findstr,还以为那个“.”是后缀的那个:P
作者: ocnzhao     时间: 2007-1-8 06:02
这个我需要
作者: willsion     时间: 2007-3-7 13:13


  Quote:
Originally posted by namejm at 2007-1-7 07:35 AM:
  今天在翻看老帖的时候,发现这个问题我曾经写过一段更加简洁的代码(请点 [url=http://www.cn-dos.net/forum/viewthread.php?tid=21989]这里[/color ...

这个真是精品了。