找回密码
 加入
搜索
查看: 1501|回复: 11

数组问题

[复制链接]
发表于 2009-5-26 14:22:26 | 显示全部楼层 |阅读模式
本帖最后由 qzdisk 于 2009-5-27 09:11 编辑


在这个目录下这些文件是根据时间来命名的!比如今天是2009年5月26日文件名就应该是2009-05-26-14-00 ! 怎么才能判断这些文件那些是昨天的或者是前天的! 请高手解答一下!本人在数组这方面还是很生疏! 对我来说这个真是一个棘手的问题!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2009-5-26 15:11:48 | 显示全部楼层
StringSplit ( "字符串", "分隔符" [, 标志 ] )


$a = StringSplit ( "文件名", "-" )
按照-来分隔文件名后判断
$a[1]就是年份
$a[2]就是月份
$a[3]就是日期
 楼主| 发表于 2009-5-26 15:27:30 | 显示全部楼层
我试试!看行不行!
 楼主| 发表于 2009-5-26 16:25:54 | 显示全部楼层
本帖最后由 qzdisk 于 2009-5-26 16:27 编辑

顺道在问下! 怎么对这里这些文件 一个一个做判断呢! 这个目录下的文件数不是固定的!
2009-05-10-14-00.rar 是15天前的文件 怎么对这类文件做判断直接删除呢!
发表于 2009-5-26 21:47:07 | 显示全部楼层
使用 _FileListToArray() 函数读取文件名到数组
通过数组操作进行判断!
发表于 2009-5-26 22:09:17 | 显示全部楼层
本帖最后由 lynfr8 于 2009-5-26 22:16 编辑
顺道在问下! 怎么对这里这些文件 一个一个做判断呢! 这个目录下的文件数不是固定的!
2009-05-10-14-00.rar 是15天前的文件 怎么对这类文件做判断直接删除呢!
qzdisk 发表于 2009-5-26 16:25

如sxd所言,首先取得年月日$a[1]、$a[2]、$a[3],然后和@YEAR   、 @MON  、 @MDAY进行数值运算,得出与当日日期的差值,从而判断数据存在的天数,继而用FileDelete 删除过期文件,放到一个循环语句里执行,直至判断和删除完毕退出。
不是很难的,尽量自己去写,写好再发上来大家再研究下
 楼主| 发表于 2009-5-26 22:54:20 | 显示全部楼层
本帖最后由 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[0])

For $l = $FileList[0]  to 1 Step -1
$s = StringSplit ($FileList[$l], "-" )
$w = $s[2]+$s[3]
        $timerar = @MON+@MDAY
    If $timerar - $w < 15 Then
 楼主| 发表于 2009-5-26 22:59:37 | 显示全部楼层
后来做了一次IF判断结果失败了! 我现在的疑惑就在于已经能读取目录内文件的个数了!
现在就是不知道判断完了 怎么返回目录删除过期的文件!
发表于 2009-5-27 03:30:55 | 显示全部楼层
本帖最后由 lynfr8 于 2009-5-27 03:34 编辑
 $w = $s[2]+$s[3]
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 = $FileList[0]  to 1 Step -1 
$s = StringSplit ($FileList[$l], "-" )
$w = $s[2]+ $s[3]
If @YEAR - $s[1] >0 Then 
  FileMove ($fold&'\'&$FileList[$l],@ScriptDir&'\'&$s[1]&'\'&$FileList[$l],8)
  $count = $count +1
ElseIf (@MON-$s[2])*30+(@MDAY-$s[3]) > 15 Then
  FileMove ($fold&'\'&$FileList[$l],@ScriptDir&'\'&$s[2]&'\'&$FileList[$l],8)
  ;MsgBox(4096,'',(@MON-$s[2])*30+(@MDAY-$s[3]) )
  $count = $count +1
Else
EndIf
Next
MsgBox (4096,"",'读取文件:'&$FileList[0]&@CRLF&'转移文件:'&$count)
先以‘年’来判断文件是否过期,是则转移到脚本目录下的以‘年’为名的文件夹
再以‘月’和‘日’来判断过期大于15天,是则转移到脚本目录下的以‘月’名的文件夹
读取并转移完之后,提示读取的数字和转移数字
为何选择转移而不是删除呢?
其实移动多文件比删除多文件要快
分类转移之后你可以再次检查是否有文件需要保留
然后直接删除文件夹再清空回收站执行效率更快

当然,如果你喜欢也可以用filedelete代替filemove。
发表于 2009-5-27 08:18:17 | 显示全部楼层
简单点,用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[0])

For $i = 1 To $FileList[0]
        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[0])
Next

评分

参与人数 1金钱 +5 贡献 +1 收起 理由
lynfr8 + 5 + 1 原创内容,感谢你对论坛的支持;希望继续发 ...

查看全部评分

 楼主| 发表于 2009-5-27 09:10:55 | 显示全部楼层
谢谢!我得理解理解!  !
发表于 2009-5-27 21:48:29 | 显示全部楼层
可恶又可爱的正则!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-10 17:59 , Processed in 0.082061 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表