Board logo

标题: [文件操作] 求获取文件路径、名称和大小的代码 [打印本页]

作者: yylogo    时间: 2008-10-8 00:32     标题: 求获取文件路径、名称和大小的代码

求获取文件路径、名称和大小的代码。
其实以下代码已经能获取文件路径和文件名,只可惜,画龙没有点睛,文件的大小不知如何获取。望bat圈内张僧繇点睛,谢谢。
dir /b /s | find "." > (yylogo.com).txt
作者: Batcher    时间: 2008-10-8 00:39

  1. @echo off
  2. for %%a in (*.txt) do (
  3.   echo 文件路径:%%~dpa
  4.   echo 文件名称:%%~nxa
  5.   echo 文件大小:%%~za
  6. )
复制代码
for /?
In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string

The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line

In the above examples %I and PATH can be replaced by other valid
values.  The %~ syntax is terminated by a valid FOR variable name.
Picking upper case variable names like %I makes it more readable and
avoids confusion with the modifiers, which are not case sensitive.

作者: pusofalse    时间: 2008-10-8 00:40

  1. @(for /r %%a in (*) do echo %%~dpnxtza)&pause
复制代码
  1. 另外,FOR 变量参照的替换已被增强。您现在可以使用下列
  2. 选项语法:
  3.      ~I         - 删除任何引号("),扩充 %I
  4.      %~fI        - 将 %I 扩充到一个完全合格的路径名
  5.      %~dI        - 仅将 %I 扩充到一个驱动器号
  6.      %~pI        - 仅将 %I 扩充到一个路径
  7.      %~nI        - 仅将 %I 扩充到一个文件名
  8.      %~xI        - 仅将 %I 扩充到一个文件扩展名
  9.      %~sI        - 扩充的路径只含有短名
  10.      %~aI        - 将 %I 扩充到文件的文件属性
  11.      %~tI        - 将 %I 扩充到文件的日期/时间
  12.      %~zI        - 将 %I 扩充到文件的大小
  13.      %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
  14.                    到找到的第一个完全合格的名称。如果环境变量名
  15.                    未被定义,或者没有找到文件,此组合键会扩充到
  16.                    空字符串
  17. 可以组合修饰符来得到多重结果:
  18.      %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
  19.      %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
  20.      %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
  21.      %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
  22.                    到找到的第一个驱动器号和路径。
  23.      %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR
复制代码

作者: 随风    时间: 2008-10-8 00:45

当前目录,不含子目录
  1. @echo off
  2. for %%i in (*) do if exist "%%i" >>a.txt echo %%~dpnxi %%~zi
  3. start "" "a.txt"
复制代码

含子目录
  1. @echo off
  2. for /r %%i in (*) do if exist "%%i" >>a.txt echo %%i %%~zi
  3. start "" "a.txt"
复制代码

[ 本帖最后由 随风 于 2008-10-8 01:29 编辑 ]
作者: 随风    时间: 2008-10-8 00:46

两位好快。
稍慢一点就是4楼了,呵呵。。。
作者: yylogo    时间: 2008-10-8 00:59     标题: 谢谢二位的中英文回答

谢谢楼上二位的中英文回答。
可没有我需要的效果。我需要某文件夹内所有的文件路径、文件名和大小的信息转换为一个a.txt文档。希望有朋友能将下面的代码改动一下,从而可以获得文件的大小信息。
dir /b /s | find "." > a.txt
这个地方真好,问题总有人回答。不像有些地方几个月也没人理睬。同仁们,好网站要记得收藏哦。
作者: pusofalse    时间: 2008-10-8 01:05

  1. @echo off
  2. cd .>a.txt
  3. for /r %%i in (*) do echo>>a.txt %%~dpnxtzi
  4. start a.txt
复制代码
%%~ta 文件的修改日期
%%~za 文件的大小信息
可以组合起来使用。 以上代码循环子目录。

[ 本帖最后由 pusofalse 于 2008-10-8 01:14 编辑 ]
作者: yylogo    时间: 2008-10-8 01:09     标题: 不好意思

那段代码是我儿子写(13岁)的,他说他没办法获得文件的大小。我一窍不通,楼上几位的回答我一测试,4楼似乎更好,可我不会转换为txt文档,只能在dos环境下看到。
你们能否再修改一下,谢谢。
作者: pusofalse    时间: 2008-10-8 01:16     标题: 回复 8楼 的帖子

粗心,7楼的代码写错了,已经修改。
作者: zqz0012005    时间: 2008-10-8 01:21

你儿子加上 find "." 是为了过滤掉文件夹吧?这样就降低了效率
dir自己有开关可以过滤:dir /a-d
作者: yylogo    时间: 2008-10-8 01:22     标题: 速度真快

我去测试一下,又有朋友回答了。7楼的产生了一个a.txt文件,可里面的内容是这样的:
%~dpnxtza
%~dpnxtza
%~dpnxtza
%~dpnxtza
%~dpnxtza
......
我需要a.txt里面有如下形式的内容:
F:\novel\小说\黑道学生\黑道学生3\黑道学生3.txt  1024k
F:\novel\小说\黑道学生\黑道学生1\黑道学生1.txt  512k
F:\novel\小说\恶魔的法则\恶魔的法则3.txt  256k
F:\novel\小说\恶魔的法则\恶魔的法则4.txt  256k

各位辛苦了,这么晚了
作者: 随风    时间: 2008-10-8 01:28

13岁,还真是不错啊。
以在4楼更改,将内容追加到a.txt中。
作者: yylogo    时间: 2008-10-8 01:30     标题: 到位了

7楼修改后,问题彻底解决。谢谢各位。明天一定让他去网站宣传贵站的神速和效率,以及负责。
上网两年,最激动的一个晚上。
作者: pusofalse    时间: 2008-10-8 01:32     标题: 回复 11楼 的帖子

(时间差问题。。。),7楼的代码原本写错了,已经修改,但仍不是你想要的格式,如下:
  1. @echo off
  2. cd.>a.txt
  3. for /r %%a in (*) do (
  4.       set/a kb=%%~za/1024
  5.       call echo %%a %%kb%%k
  6. )>>a.txt
  7. start a.txt
复制代码
%%~za扩展的大小单位为字节,只好除以1024得到其KB单位的大小,但又不能计算小数,所以只能算出个大概的大小了。
作者: yylogo    时间: 2008-10-8 01:36     标题: 4楼的效果也出来了

各位先生,遥寄香烟一包,聊表谢意。

贵站一个字:快
作者: yylogo    时间: 2008-10-8 01:49     标题: 儿子交给你们了

14楼的谢谢,答案已不是很重要了。
你们恢复了我对专业人员回答问题的信心。以前总在新浪的爱问、百度的知道、雅虎的知识堂找师傅,好难咯。今晚算是有缘各位了,我的一个不眠之夜。。。
儿子交给你们了,我一万个放心。
明天再把他的那个“分小说”的程序交给你们修改,我找不到他的源程序了,c语言写的,非常好用,我经常用,但有一个小缺陷,他无法克服。

[ 本帖最后由 yylogo 于 2008-10-8 01:51 编辑 ]
作者: zqz0012005    时间: 2008-10-8 01:59     标题: 来个vbs吧

计算文件大小要准确一些
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. fso.OpenTextFile("a.txt",8,true).WriteLine TreeFile(".")
  3. CreateObject("WScript.Shell").Run "a.txt"
  4. function TreeFile(strPath)
  5.     Set oFolder = fso.GetFolder(strPath)
  6.     set Files = oFolder.Files
  7.     For Each oFile In Files
  8.         s = s & oFile.Path & vbTab & Left(oFile.Size/1024,5) & "KB" & vbCrLf
  9.     Next
  10.     Set Folders = oFolder.Subfolders
  11.     For Each oFolder In Folders
  12.         s = s & TreeFile(oFolder.Path) '递归
  13.     Next
  14. TreeFile = s
  15. End function
复制代码

作者: namejm    时间: 2008-10-8 12:37

  cmd的 set /a 语句只能计算 -2^31~2^31-1 这个范围内的数据,无论单独的数字或者是经过运算后的数字,只要超过这个范围,都会出错,在做算术运算的时候要特别小心。用纯批处理只能获取到以字节为单位的数字,若要转化为以K或M为单位的数据,不可避免地要遇到大数的处理问题。若有上G的单个文件,以上的批处理代码将会出现错误。
作者: Batcher    时间: 2008-10-8 16:07     标题: 回复 18楼 的帖子

大数计算还是交给VBS来做吧^_^
作者: terse    时间: 2008-10-9 16:12

除以1024得到其KB单位的大小  当心溢出
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  3.   set str=%%~zi
  4.   if %%~zi lss 1024 (set k=字节&set z=%%~zi)else set k=KB&call :lp
  5.   call echo  %%~fi !z! !K!
  6.   set z=&set n=&set l=
  7. )
  8. pause&exit
  9. :lp
  10.     set/a l=%l%%str:~,1%%%1024,s=%l%%str:~,1%/1024
  11.     if %z%#==0# set z=
  12.     set z=%z%%s%
  13.     set str=%str:~1%
  14.     if defined str goto lp
  15.     set z=%z%.
  16. :lp1
  17.     set/a l*=10,s=l/1024,n+=1
  18.     if %n% lss 3 (
  19.     set z=%z%%s%
  20.     set/a l=l%%1024
  21.     goto lp1
  22. )
复制代码

[ 本帖最后由 terse 于 2008-10-9 16:37 编辑 ]




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2