数组问题
本帖最后由 qzdisk 于 2009-5-27 09:11 编辑在这个目录下这些文件是根据时间来命名的!比如今天是2009年5月26日文件名就应该是2009-05-26-14-00 ! 怎么才能判断这些文件那些是昨天的或者是前天的! 请高手解答一下!本人在数组这方面还是很生疏! 对我来说这个真是一个棘手的问题! StringSplit ( "字符串", "分隔符" [, 标志 ] )
$a = StringSplit ( "文件名", "-" )
按照-来分隔文件名后判断
$a就是年份
$a就是月份
$a就是日期 我试试!看行不行! 本帖最后由 qzdisk 于 2009-5-26 16:27 编辑
顺道在问下! 怎么对这里这些文件 一个一个做判断呢! 这个目录下的文件数不是固定的!
2009-05-10-14-00.rar 是15天前的文件 怎么对这类文件做判断直接删除呢! 使用 _FileListToArray() 函数读取文件名到数组
通过数组操作进行判断! 本帖最后由 lynfr8 于 2009-5-26 22:16 编辑
顺道在问下! 怎么对这里这些文件 一个一个做判断呢! 这个目录下的文件数不是固定的!
2009-05-10-14-00.rar 是15天前的文件 怎么对这类文件做判断直接删除呢!
qzdisk 发表于 2009-5-26 16:25 http://www.autoitx.com/images/common/back.gif
如sxd所言,首先取得年月日$a、$a、$a,然后和@YEAR 、 @MON、 @MDAY进行数值运算,得出与当日日期的差值,从而判断数据存在的天数,继而用FileDelete 删除过期文件,放到一个循环语句里执行,直至判断和删除完毕退出。
不是很难的,尽量自己去写,写好再发上来大家再研究下 本帖最后由 qzdisk 于 2009-5-26 23:00 编辑
问题是我写到这里已经茫然了!#Include <File.au3>
#Include <Array.au3>
$FileList=_FileListToArray("G:\编程范例\自动备份工具\1\")
If @Error=1 Then
MsgBox (0,"","No Files\Folders Found.")
Exit
EndIf
;_ArrayDisplay($FileList,"$FileList")
;MsgBox(48,"",$FileList)
For $l = $FileListto 1 Step -1
$s = StringSplit ($FileList[$l], "-" )
$w = $s+$s
$timerar = @MON+@MDAY
If $timerar - $w < 15 Then
后来做了一次IF判断结果失败了! 我现在的疑惑就在于已经能读取目录内文件的个数了!
现在就是不知道判断完了 怎么返回目录删除过期的文件! 本帖最后由 lynfr8 于 2009-5-27 03:34 编辑
$w = $s+$s
timerar = @MON+@MDAY
If $timerar - $w < 15 Then
你写的这句判断很有问题:
5.27和1.1比较结果是(5+27)-(1+1)=30
5.27和4.28比较结果是 (5+27)-(4+28)=0
5.27和12.11(2008年)比较结果是 (5+27)-(12+11)=9
5.27和5.1(2008年)比较结果是 (5+27)-(5+1)=26
以上都存在>15和<15的情况但却都是过时的数据需要删除的
这样的判断句式是无法成功的,还会误删文件
修改代码: #Include <File.au3>
#Include <Array.au3>
$fold ='C:\2'
$FileList=_FileListToArray($fold)
If @Error Then
MsgBox (4096,"","没有找到文件")
Exit
EndIf
;_ArrayDisplay($FileList,"$FileList")
$count = 0
For $l = $FileListto 1 Step -1
$s = StringSplit ($FileList[$l], "-" )
$w = $s+ $s
If @YEAR - $s >0 Then
FileMove ($fold&'\'&$FileList[$l],@ScriptDir&'\'&$s&'\'&$FileList[$l],8)
$count = $count +1
ElseIf (@MON-$s)*30+(@MDAY-$s) > 15 Then
FileMove ($fold&'\'&$FileList[$l],@ScriptDir&'\'&$s&'\'&$FileList[$l],8)
;MsgBox(4096,'',(@MON-$s)*30+(@MDAY-$s) )
$count = $count +1
Else
EndIf
Next
MsgBox (4096,"",'读取文件:'&$FileList&@CRLF&'转移文件:'&$count)
先以‘年’来判断文件是否过期,是则转移到脚本目录下的以‘年’为名的文件夹
再以‘月’和‘日’来判断过期大于15天,是则转移到脚本目录下的以‘月’名的文件夹
读取并转移完之后,提示读取的数字和转移数字
为何选择转移而不是删除呢?
其实移动多文件比删除多文件要快
分类转移之后你可以再次检查是否有文件需要保留
然后直接删除文件夹再清空回收站执行效率更快
当然,如果你喜欢也可以用filedelete代替filemove。 简单点,用UDF的_Date和正则来解决。
#include <Array.au3>
#include <File.au3>
#include <Date.au3>
Local $sPath = "G:\编程范例\自动备份工具\1", $sDate, $iDateDiff = 15
$FileList = _FileListToArray($sPath)
If @error Then
MsgBox(0, "", "No Files\Folders Found.")
Exit
EndIf
;_ArrayDisplay($FileList, "$FileList")
;MsgBox(48, "", $FileList)
For $i = 1 To $FileList
If NOT StringRegExp($FileList[$i], "(?i)^(\d{4})-(\d{2})-(\d{2})(-\d{2}){3}.rar$") Then ContinueLoop
$sDate = StringRegExpReplace($FileList[$i], "(?i)^(\d{4})-(\d{2})-(\d{2})(-\d{2}){3}.rar$", "\1/\2/\3")
If _DateDiff("D", $sDate, _NowCalc()) > $iDateDiff Then FileDelete($sPath & "\" & $FileList)
Next 谢谢!我得理解理解!! 可恶又可爱的正则!!!:face (18):
页:
[1]