遍历某个文件夹(目录)下的所有文件 以及获取文件夹大小

本文介绍了如何使用PHP遍历指定目录下的所有文件,提供了两种不同的实现方法,包括使用dir对象和readdir()函数。此外,还提供了一个获取文件夹大小的函数代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

一:遍历文件夹

http://www.nowamagic.net/php/php_TraversalAllFilesInDir.php

有这么一个需求,需要遍历某个文件夹(目录)下的所有文件。下面是解决这个问题所写的PHP代码,在这里记录一下。

第一种实现办法是用dir返回对象,第二种实现办法:用readdir()函数。代码如下:

<?php
/**********************
 * 一个简单的目录递归函数
 * 第一种实现办法:用dir返回对象
 ***********************/
function tree($directory)
{
    $mydir = dir($directory);
    echo "<ul>\n";
    while ($file = $mydir->read()) {
        if ((is_dir("$directory/$file")) AND
<think>我们有一个明确的任务:使用BAT脚本遍历文件夹内容并输出到TXT文件。 根据引用[1]引用[3]中的示例,我们可以总结出基本步骤: 1. 使用`for`循环遍历文件夹(可以使用`/R`参数来递归遍历文件夹)。 2. 将遍历到的每个文件文件夹的信息输出到TXT文件。 引用[1]中给出了一个简单的例子:遍历指定目录的子文件夹并输出(但该例子是输出文件夹名,而用户要求遍历文件夹内容,可能包括文件文件夹)。 引用[3]中则展示了如何遍历文件夹下的所有文件(包括子文件夹中的文件)并将每个文件文件大小输出到TXT文件。 用户需求是“遍历文件夹内容”,这个内容可以包括文件文件夹。我们可以根据用户的具体需求选择: - 如果只需要列出文件,则遍历文件。 - 如果需要列出文件夹,则遍历文件夹。 - 或者两者都需要。 由于用户没有特别说明,我们可以提供两种方式,并让用户自行选择。 下面是一个通用的BAT脚本示例,它将递归遍历指定目录下的所有文件文件夹,并将它们的路径输出到TXT文件。 注意:在BAT脚本中,我们可以使用`for /R`来递归遍历。 方案1:只输出文件 方案2:只输出文件夹 方案3:同时输出文件文件夹 这里我们给出一个同时输出文件文件夹的脚本,并注释说明如何只输出文件或只输出文件夹。 脚本如下: ```batch @echo off REM 设置要遍历目录路径 set "target_dir=C:\Your\Target\Directory" REM 设置输出文件路径 set "output_file=output.txt" REM 递归遍历目标目录,输出所有文件文件夹到TXT REM 注意:这里使用for /R递归遍历,然后使用dir /b /s来获取完整路径,但也可以使用for /R直接处理 REM 方法:使用for /R遍历,并输出 ( REM 输出文件夹 for /D /R "%target_dir%" %%d in (*) do ( echo [文件夹] %%d ) REM 输出文件 for /R "%target_dir%" %%f in (*) do ( echo [文件] %%f ) ) > "%output_file%" echo 完成!结果已保存到 %output_file% pause ``` 但是,上面的脚本会先遍历所有文件夹,再遍历所有文件。而且,如果文件夹很多,可能会先输出所有文件夹再输出所有文件。 另一种方法是使用`dir`命令递归列出所有内容,然后重定向到文件: ```batch @echo off set "target_dir=C:\Your\Target\Directory" set "output_file=output.txt" dir /b /s /a "%target_dir%" > "%output_file%" echo 完成!结果已保存到 %output_file% pause ``` 解释: /b:使用简洁格式(只显示完整路径文件名) /s:递归子目录 /a:显示所有属性(包括隐藏文件系统文件),如果不加/a,则不会显示隐藏文件。如果只想显示文件文件夹(不区分),则使用/a即可。 但是,`dir /b /s`输出的结果中,文件文件夹都会显示,但无法直接区分是文件还是文件夹。在`dir`命令的输出中,文件夹是没有扩展名的,但这并不准确。 为了区分文件文件夹,我们可以使用以下脚本(使用`for`循环属性判断): ```batch @echo off set "target_dir=C:\Your\Target\Directory" set "output_file=output.txt" REM 删除已存在的输出文件(如果不需要可以去掉) if exist "%output_file%" del "%output_file%" REM 递归遍历目标目录 for /R "%target_dir%" %%a in (.) do ( REM 输出当前文件夹 echo [文件夹] %%~fa REM 输出当前文件夹下的所有文件 for %%b in ("%%~fa\*") do ( echo [文件] %%~fb ) ) >> "%output_file%" echo 完成!结果已保存到 %output_file% pause ``` 但是,上面的脚本会重复输出文件夹(因为每个文件夹都会在循环中被遍历到),并且每个文件都会在它所在的文件夹被处理时输出一次。 用户可能只需要一个简单的列表。因此,我们回到最初的需求:遍历文件夹内容并输出到TXT。我们可以选择简单的方式,即使用`dir`命令。 如果用户不需要区分文件文件夹,那么使用`dir /b /s`是最简单的。 如果用户需要区分,我们可以使用以下脚本(利用`dir`的`/a`参数分别获取文件文件夹): ```batch @echo off set "target_dir=C:\Your\Target\Directory" set "output_file=output.txt" REM 先输出文件夹 dir /b /s /a:d "%target_dir%" > "%output_file%" REM 再输出文件,追加到同一文件 dir /b /s /a:-d "%target_dir%" >> "%output_file%" echo 完成!结果已保存到 %output_file% pause ``` 解释: /a:d 表示只显示文件夹 /a:-d 表示显示非文件夹(即文件) 这样,输出文件中先列出所有文件夹,再列出所有文件。 但是,用户可能希望按照原始顺序(即文件系统遍历的顺序)输出。不过,由于用户没有特别要求,我们可以提供这个方案。 根据引用[1]引用[3],我们也可以使用`for`循环来分别处理。 这里我们提供一个更符合引用[3]中做法的例子(遍历文件并输出文件大小): 引用[3]中:`for /R %%s in (.,*) do ( echo '%%~nxs %%~zs' >>../a.txt )` 这个例子输出文件文件大小。我们可以借鉴。 因此,我们可以根据用户的具体需求定制输出内容。 由于用户问题描述比较简单,我们提供两种方案供选择: 方案A:简单输出所有文件文件夹的路径(不区分,按原始顺序) 方案B:区分文件文件夹,并输出详细信息(如文件大小等) 这里我们以方案A为例(简单输出路径): ```batch @echo off set "target_dir=C:\Your\Target\Directory" set "output_file=output.txt" REM 使用dir命令递归列出所有内容(包括文件文件夹),按原始顺序(但注意:dir命令默认先文件夹文件?) dir /b /s /a "%target_dir%" > "%output_file%" echo 完成!结果已保存到 %output_file% ``` 但是,`dir /b /s`会先列出文件夹,再列出文件夹下的内容(递归)。实际上,它输出的顺序是:先输出目标目录下的所有文件夹(只显示文件夹,不展开),然后输出目标目录下的文件,然后进入第一个文件夹递归输出。所以并不是完全按照目录树的结构顺序输出。 如果用户希望按照目录树的结构顺序(即深度优先),那么`dir /b /s`就是这样的顺序。 如果用户希望按照广度优先,那么可能需要更复杂的脚本。 鉴于用户没有特别说明,我们采用简单通用的方法。 因此,我们推荐使用以下脚本(并允许用户自定义目标目录输出文件): 脚本:list_contents.bat ```batch @echo off REM 设置目标目录,这里使用第一个参数,如果没有参数则使用当前目录 set "target_dir=%~1" if "%target_dir%"=="" set "target_dir=%cd%" REM 设置输出文件,第二个参数,如果没有则使用默认文件名 set "output_file=%~2" if "%output_file%"=="" set "output_file=output.txt" echo 正在遍历目录: "%target_dir%" echo 输出文件: "%output_file%" REM 使用dir命令递归列出所有文件文件夹 dir /b /s /a "%target_dir%" > "%output_file%" echo 完成! pause ``` 这样,用户可以传入参数: 第一个参数:目标目录(可选) 第二个参数:输出文件(可选) 例如: list_contents.bat "D:\MyFolder" "my_list.txt" 如果不带参数,则遍历当前目录并输出到当前目录下的output.txt。 注意:如果目标目录路径包含空格,需要用引号括起来。 另外,如果用户想要输出相对路径,而不是绝对路径,那么我们可以改变方法,使用`for /R`并输出相对路径。但用户要求是遍历文件夹内容,通常绝对路径更清晰。 根据引用[3]中的例子,他们输出了文件大小。如果用户需要输出文件的其他属性(如大小、修改日期等),我们可以修改`dir`命令的参数,去掉`/b`,但这样就不是简洁格式了。所以,我们保持简洁格式(只有路径)。 如果用户需要输出详细信息,可以去掉`/b`,但是这样输出的格式就不适合机器处理,而是适合人阅读。所以,我们根据用户需求,这里使用`/b`。 因此,最终脚本如下: 请将以下代码保存为BAT文件(例如:list_folder_contents.bat): ```batch @echo off REM 脚本:遍历指定目录(包括子目录)下的所有文件文件夹,将完整路径输出到TXT文件 REM 用法:list_folder_contents.bat [目标目录] [输出文件] REM 示例:list_folder_contents.bat "C:\MyFolder" "file_list.txt" setlocal enabledelayedexpansion REM 检查参数 if "%1"=="" ( set "target_dir=%cd%" ) else ( set "target_dir=%~1" ) if "%2"=="" ( set "output_file=output.txt" ) else ( set "output_file=%~2" ) echo 正在遍历目录: "%target_dir%" echo 输出文件: "%output_file%" REM 确保目标目录路径的结尾没有反斜杠(避免与dir命令输出的格式不一致) if "!target_dir:~-1!"=="\" set "target_dir=!target_dir:~0,-1!" REM 使用dir命令递归列出所有内容(包括文件文件夹) dir /b /s /a "%target_dir%" > "%output_file%" echo 完成!共处理了以下内容: echo 输出文件位于: "%cd%\%output_file%" endlocal pause ``` 注意:上述脚本中,我们处理了目标目录结尾的反斜杠,因为`dir /b /s`在输出目录时不会在结尾添加反斜杠,所以如果用户输入了结尾的反斜杠,我们去掉它,以保证输出格式一致。 但是,实际上`dir`命令可以处理路径结尾的反斜杠,它会自动标准化。所以这一步也可以省略。不过为了保险,我们去掉结尾的反斜杠。 另外,我们使用了延迟变量扩展(setlocal enabledelayedexpansion)来处理变量,以避免在循环中(虽然这里没有循环)出现的问题。 现在,用户只需编辑脚本或通过参数指定目录输出文件即可。 如果用户希望双击运行,则不需要参数,使用默认值(当前目录output.txt)。 如果用户需要更多的定制(如只输出文件或只输出文件夹),我们可以修改脚本,增加参数控制。但为了简单,我们先提供这个基础版本。 最后,我们生成相关问题。</think>以下是使用BAT脚本遍历文件夹内容并输出到TXT文件的完整解决方案: ### 解决方案 ```batch @echo off REM 设置要遍历目录路径 set "target_dir=C:\Your\Target\Directory" REM 设置输出文件路径 set "output_file=output.txt" REM 递归遍历目录并输出到文件 echo 正在遍历目录: %target_dir% echo 输出文件: %output_file% echo. REM 删除已存在的输出文件 if exist "%output_file%" del "%output_file%" REM 遍历所有文件文件夹 for /R "%target_dir%" %%a in (.,*) do ( echo [路径] %%~fa echo [类型] %%~aa echo [名称] %%~nxa echo [大小] %%~za 字节 echo [修改日期] %%~ta echo --------------------------------------------------- ) >> "%output_file%" echo 完成!共处理了以下内容: echo - 所有文件文件夹路径 echo - 文件/文件夹属性 echo - 名称扩展名 echo - 文件大小 echo - 最后修改日期 pause ``` ### 使用说明 1. **编辑脚本**: - 将`C:\Your\Target\Directory`替换为你要遍历的实际目录路径 - 可修改`output.txt`为自定义输出文件名 2. **运行脚本**: - 保存为`.bat`文件(如`list_files.bat`) - 双击运行,结果将保存到指定TXT文件 3. **输出内容**: ```txt [路径] C:\Target\file.txt [类型] -a------ [名称] file.txt [大小] 1024 字节 [修改日期] 2023/10/15 14:30 --------------------------------------------------- [路径] C:\Target\Subfolder [类型] d-------- [名称] Subfolder [大小] 0 字节 [修改日期] 2023/10/14 10:15 --------------------------------------------------- ``` ### 关键参数说明 1. `for /R`:递归遍历所有子目录 2. `%%~fa`:完整路径 3. `%%~aa`:文件属性(`d`开头表示文件夹) 4. `%%~nxa`:文件名+扩展名 5. `%%~za`:文件大小(字节) 6. `%%~ta`:最后修改日期 7. `>>`:追加输出到文件 ### 自定义选项 - **仅输出文件名**: ```batch for /R "%target_dir%" %%a in (*) do echo %%~nxa >> "%output_file%" ``` - **仅输出文件夹**: ```batch for /D /R "%target_dir%" %%d in (*) do echo %%~fd >> "%output_file%" ``` - **输出特定类型文件**: ```batch for /R "%target_dir%" %%a in (*.jpg,*.png) do echo %%~fa >> "%output_file%" ``` [^1]: 脚本需保存为.bat文件并修改目标目录路径 [^2]: 使用`for /R`实现递归遍历 [^3]: 通过文件属性区分文件夹(`d`)文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值