找回密码
 加入
搜索
查看: 4623|回复: 7

[AU3基础] fileread 和 filereadline 问题求助

  [复制链接]
发表于 2011-5-25 21:22:44 | 显示全部楼层 |阅读模式
本帖最后由 infotechewen 于 2011-5-25 21:45 编辑

功能:定时备份指定目录下(包括子文件夹)所有*.xls 文件,到指定备份目录下,并跟源路径一致。
MsgBox(262144,"**********","框框是难看了点,不过咋说也是个脚本,对不?" & @CRLF & "熟练者可直接修改setup.ini文件,无需运行此设置" , 5)
$sDir = InputBox("备份源路径" ,"你想备份什么目录(切记以\结束!)" & @CRLF & "格式 g:\, g:\files\" , "g:\files\")
If @error = 1 Then Exit
IniWrite(@ScriptDir&"\setup.ini","backup", "源路径" ,$sDir)
$sFile = InputBox("备份文件格式", "你想备份该目录下什么格式的文件(支持通配符)" & @CRLF & "格式 *.xls , *.xls?" , "*.xls?")
If @error = 1 Then Exit
IniWrite(@ScriptDir&"\setup.ini","backup" , "文件格式" ,$sFile)
$copydir = InputBox("备份目的路径" ,"你想备份到哪?(切记以\结束!)" & @CRLF & "格式 e:\, e:\backup\" , "e:\backup\")
If @error = 1 Then Exit
IniWrite(@ScriptDir&"\setup.ini","backup", "目的路径" ,$copydir)
$hour = InputBox("备份时间设置","请输入开始备份时间(24小时制)" & @CRLF &"例:2330 23点30分" , "2330" )
If @error = 1 Then Exit
IniWrite(@ScriptDir&"\setup.ini","backup" , "备份时间" ,$hour) ;时间格式 在每天凌晨2点半启动: 0230
Dim $flag = MsgBox(4,"完成","设置完成。是否现在启动备份计划?")
If $flag = 7 Then Exit
If ProcessExists("backup.exe") Then ProcessClose("backup.exe")
Run(@ScriptDir&"\backup.exe")


#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=..\..\AU3\FB.ico
#AutoIt3Wrapper_Res_Comment=每天定时备份文件
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <file.au3>
Opt("TrayIconHide",1)
RegWrite("HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run", "2330AutoBackup", "REG_SZ", @ScriptFullPath)

$sDir = IniRead(@ScriptDir & "\setup.ini" , "backup" ,"源路径" ,"error")
$sFile = IniRead(@ScriptDir & "\setup.ini" , "backup" ,"文件格式" ,"error")
$copydir = IniRead(@ScriptDir & "\setup.ini" , "backup" ,"目的路径" ,"error")
$hour = IniRead(@ScriptDir & "\setup.ini" , "backup" ,"备份时间" ,"error") & "01"
$sOutFile = @TempDir & "\files.txt"
$logpath = @ScriptDir & "\log\"
While 1
        Sleep(1000)
If @HOUR & @MIN & @SEC = $hour Then

RunWait(@COMSPEC & ' /c dir /a /s /b "' & $sDir & $sFile & '" > "' & $sOutFile & '"' , "", @SW_HIDE)

For $n = 1 To 1000
$read = FileReadLine($sOutFile , $n)
        If @error = -1 Then ExitLoop
        $t = StringLeft($sDir ,2)
$dDir = StringReplace($read,$t, "")
$copy = String($read)

FileCopy($read , $copydir & @YEAR & @MON & @MDAY & $dDir ,9)
_FileWriteLog($logpath & @YEAR & @MON & @MDAY & ".log" , "成功备份  " & $copy & "  到  " & $copydir & @YEAR & @MON & @MDAY & $dDir)
Next
FileDelete($sOutFile)

EndIf

WEnd        


写了个每天定时备份文件的代码。但感觉用filereadline的话,如果该目录下文件太多,可能会比较耗资源。fileread的话速度快很多,但用fileread读出来的一堆文件路径,用filecopy调用时不成功,或不知道办法。请教:

1,这个例子中,用fileread的话如何写?(读出的貌似出来array?)
2,提高效率,简洁代码。用其他更好的办法达到同样的功能。

谢谢。
 楼主| 发表于 2011-5-25 22:56:54 | 显示全部楼层
顶一下自己吧
 楼主| 发表于 2011-5-26 09:38:49 | 显示全部楼层
清晨一顶,希望有人帮忙
发表于 2011-5-26 11:00:36 | 显示全部楼层
用 _FileReadToArray 试下
发表于 2011-5-26 17:09:10 | 显示全部楼层
回复 1# infotechewen
你代码慢的原因是因为,有些运算没必要做到循环里去,我发现有些变量只求一次好像就可以了,根本与1 to 1000 没什么关系啊,
另外如果你是想一次得到所有行的数据的话,要用到正则的吧!
因为不知道你的程序的附件,不好做什么改动,可以给你个例子看看!
$array=StringRegExp(FileRead("txt.txt"),'.*',3)
其中$array[0]-$array[999],就是你要的东西
 楼主| 发表于 2011-5-26 22:03:13 | 显示全部楼层
回复  infotechewen
你代码慢的原因是因为,有些运算没必要做到循环里去,我发现有些变量只求一次好像就可 ...
love5173 发表于 2011-5-26 17:09



    我已经用了fileread 来读取文件路径,到数组里。关键是数组的分割问题。已经解决了。

你所说的正则应该是效率最高的吧。正则我不会写
发表于 2011-5-26 22:35:19 | 显示全部楼层
回复 6# infotechewen
也不是那意思,解决就好,我是发现26 27 28 行貌似不需要加入到循环里面去的,在循环外面执行一次就可以了,貌似是这样的!所以说你处理起来会慢一点
 楼主| 发表于 2011-5-27 09:48:27 | 显示全部楼层
回复  infotechewen
也不是那意思,解决就好,我是发现26 27 28 行貌似不需要加入到循环里面去的,在循环 ...
love5173 发表于 2011-5-26 22:35


谢谢关注和回复
26,27 是为了替换目标路径前面2个字符,也就是盘符号比如 d:  e: ,是为了拷贝跟源地址一样的路径下。我不知道有没其他更好的写法,只是个人只能琢磨到这个笨方法。

我说效率低,是觉得用for 1 to 1000,但如果日积月累,文件夹下的xls文件超过1000,或者更多,这个脚本就不完全备份了。又或者只有10来个的话,脚本也要循环算到1000才停止,效率是低了。

现在我是更改了使用fileread(),然后分割数组, 用 for $i = 1  to  $read[0] ,这样就解决了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-21 05:28 , Processed in 0.079596 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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