ccy666 发表于 2012-2-12 16:46:32

[已解决]如何把文件夹及文件名称按要求写入文本文件?

本帖最后由 ccy666 于 2012-2-12 18:27 编辑

小弟有一文件夹DATA,里面所含文件夹及文件如下:
D:\DATA
├─AAA
│      ECV.txt
│      HR1.txt
│      SD.txt
│      
└─BBB
      1.txt
      GG345.txt

想写一个脚本,要求最终能得到如下内容的INI文件:
[管理设置]
新增分类=BBB|AAA|
[新增代码]
AAA=ECV/HR1/SD/
BBB=1/GG345/

网上看了一些例子,学着写代码如下:#include <File.au3>

inidelete("manager.ini", "管理设置", "新增分类")
inidelete("manager.ini", "新增代码")

_FileRecur("Data")

Func _FileRecur($_Path)
      $folder = _FileListToArray($_Path, "*", 2)
      If Not IsArray($folder) Then Return 0
      For $o = 1 To $folder
                        INIWRITE( "manager.ini", "管理设置", "新增分类", $folder[$o] & "|" & INIREAD( "manager.ini", "管理设置", "新增分类", ""))
                        ;$NAME = 此处的代码如何写才能获取文件名称?
            INIWRITE( "manager.ini", "新增代码", $folder[$o], $NAME & "/")
                        Next
        EndFunc   ;==>_FileRecur请问以上代码中$NAME =后代码该如何写才能获取到文件名称?谢谢了

afan 发表于 2012-2-12 17:28:37

为何要去掉后缀名呢?只有一种格式 .txt 的文件(⊙_⊙)?

user3000 发表于 2012-2-12 17:31:03

首先, 判断是子目录, 然后获取子目里的文件(夹), 然后去掉后缀名(如果有的话),
将它们先格式化(生成字符串), 最后一次写进INI, 这样效率高(如果文件多的话).
Func _FileRecur($_Path)
$folder = _FileListToArray($_Path, "*", 2)
If Not IsArray($folder) Then Return 0
Local $Dirs = ''
For $o = 1 To $folder
        If FileGetAttrib($folder[$o]) = 'd' Then
                $Dirs &= $folder[$o] & '|'
                $sFiles = _FileListToArray($_Path & '\' & $folder[$o])
                If Not @error Then
                        Local $files = ''
                        For $i = 1 To $sFiles
                                $tempfile = StringRegExpReplace($sFiles[$i], '\.{3}\z', '')
                                $files &= $tempfile & '/'
                        Next
                        IniWrite($ini, "新增代码", $folder[$o], $files)
                EndIf
        EndIf
Next
IniWrite($ini, "管理设置", "新增分类", $Dirs)
EndFunc

ccy666 发表于 2012-2-12 17:35:58

为何要去掉后缀名呢?只有一种格式 .txt 的文件(⊙_⊙)?
afan 发表于 2012-2-12 17:28 http://www.autoitx.com/images/common/back.gif


    谢谢版主关注,其实这是lynfr8版主的那AU3代码管理器的配置文件,里面是后缀AU3文件,我想实现跟官方的那数据通用,所以就想学学改改代码

ccy666 发表于 2012-2-12 17:43:27

回复 3# user3000


    谢谢兄长,初步试用一下在INI文件中只写入[管理设置]新增分类=,也许是我操作有误,还得好好消化一下,谢谢

user3000 发表于 2012-2-12 17:49:11

回复user3000


    谢谢兄长,初步试用一下在INI文件中只写入[管理设置]新增分类=,也许是我操作有误 ...
ccy666 发表于 2012-2-12 17:43 http://www.autoitx.com/images/common/back.gif


    试下用绝对路径调用该函数?

afan 发表于 2012-2-12 18:02:46

谢谢版主关注,其实这是lynfr8版主的那AU3代码管理器的配置文件,里面是后缀AU3文件,我想实现跟 ...
ccy666 发表于 2012-2-12 17:35 http://www.autoitx.com/images/common/back.gif#include <File.au3>

_FileRecur(@ScriptDir & '\DATA', @ScriptDir & '\manager.ini')

Func _FileRecur($_Path, $sFIni)
        Local $aFolder = _FileListToArray($_Path, '*', 2)
        If Not IsArray($aFolder) Then Return 0
        Local $s1 = '新增分类 = ', $s2 = ''
        For $o = 1 To $aFolder
                $s1 &= $aFolder[$o] & '|'
                Local $aFolder1 = _FileListToArray($_Path & '\' & $aFolder[$o], '*', 1)
                $s2 &= $aFolder[$o] & ' = '
                If Not IsArray($aFolder1) Then
                        $s2 &= @LF
                        ContinueLoop
                EndIf
                For $i = 1 To $aFolder1
                        $s2 &= StringRegExpReplace($aFolder1[$i], '\.[^.]{1,5}$', '') & '/'
                Next
                $s2 &= @LF
        Next
        IniWriteSection($sFIni, '管理设置', $s1)
        IniWriteSection($sFIni, '新增代码', $s2)
EndFunc   ;==>_FileRecur

afan 发表于 2012-2-12 18:06:34

本帖最后由 afan 于 2012-2-12 18:16 编辑

不知道楼主
新增分类=BBB|AAA|
与下面的
AAA=
BBB=
顺序相反

7#的顺序是相同的。

ccy666 发表于 2012-2-12 18:20:31

不知道楼主
新增分类=BBB|AAA|
与下面的
AAA=
BBB=
顺序相反

7#的顺序是相同的。
afan 发表于 2012-2-12 18:06 http://www.autoitx.com/images/common/back.gif

谢谢A版,顺序可能是我手工添加时弄乱或者lynfr8管理器原本就是的,但这不影响使用,谢谢您费心了!

PS:也谢谢6楼兄长,只是小弟是新手,还是不懂得如何用修改为绝对路径{:face (197):}

afan 发表于 2012-2-12 18:21:43

回复 9# ccy666


    另外提醒下,这种匹配文件之类的 ini 文件,如果文件名中含有“=”符号,则会在操作时产生一定的错误数据。
如文件夹名为“A=====A”,用内置ini*函数将无法正确操作,如此,请论坛搜索“_Ini”
页: [1]
查看完整版本: [已解决]如何把文件夹及文件名称按要求写入文本文件?