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

[AU3基础] FileExists会锁定改文档吗?[已解决]

  [复制链接]
发表于 2010-11-10 21:11:42 | 显示全部楼层 |阅读模式
本帖最后由 cfxqm 于 2010-11-11 10:34 编辑

我想编个程序监控某个文档,当此文档被修改后向邮箱发送邮件。程序如下:
#include  <SmtpMailer.au3>

Const $FileName="E:\TBReport\Report.txt"
Local $FileTime,$yyyymd

$FileTime = _GetFileTime()
While (@HOUR>=8 And @HOUR <=23)
        $yyyymd = _GetFileTime()
        If($FileTime <> $yyyymd) Then  ;检查文件是否被修改过(修改过时间会变化)
                        $FileTime = $yyyymd
                        _SendMail()    ;如果修改过则以此文件作为附件发送邮件
        EndIf
        Sleep(10000) ;10秒钟检查一次文件
WEnd

Func _GetFileTime()
Local $file,$t
If FileExists($FileName) Then ;检查报告文件是否存在
        $t =  FileGetTime($FileName,0,1)  ;获取文件建立的时间
        If Not @error Then
                Return $t
        EndIf
Else ;建立一个新文件
    $file = FileOpen($FileName, 1)
        
        If $file = -1 Then
                MsgBox(0, "错误", "无法打开目标文件。",5)
                Exit
        EndIf
        FileClose($file)
EndIf
EndFunc


Func _SendMail()
省略
代码在运行时,发送邮件正常,但是在我试着手动打开该文档,修改后保存时,有时候能保存,有时候不能保存,提示“不能创建文件,请确认路径和文件名是否正确”。似乎文件被写保护了,可能是被我所运行的程序打开后没关闭。但是查帮助文件看不出FileExists会锁定啊。是什么原因呢?

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

发表于 2010-11-10 21:17:12 | 显示全部楼层
应该是第24行FileOpen的原因
 楼主| 发表于 2010-11-10 21:56:04 | 显示全部楼层
从程序结构上来看,由于文档一直存在,因此23~30行不会执行。我把FileOpen,FileClose语句删掉后还是会出现这个问题。
 楼主| 发表于 2010-11-10 22:18:03 | 显示全部楼层
现象是,有时候修改后能保存,有时候不能保存。不能保存时,取消后,再修改又能保存。难道是修改的时候碰上FileExists或者FileGetTime语句正在执行就不能保存了吗?有什么方法能避免呢?
发表于 2010-11-11 00:04:52 | 显示全部楼层
回复 4# cfxqm
If FileExists("E:\TBReport\Report.txt") <> 0 Then MsgBox(0, "", "文件存在")
If FileExists("E:\TBReport\Report.txt") = 0 Then MsgBox(0, "", "文件不存在")
 楼主| 发表于 2010-11-11 01:06:38 | 显示全部楼层
我将程序精简成下面的代码,还是会出现这个现象。
看来是FileGetTime的问题了。
#include  <SmtpMailer.au3>

Const $FileName="E:\TBReport\Report.txt"
Local $FileTime,$yyyymd

$FileTime = FileGetTime($FileName,0,1)
While (@HOUR>=1 And @HOUR <=23)
        $yyyymd = FileGetTime($FileName,0,1)
        If($FileTime <> $yyyymd) Then  ;检查文件是否被修改过(修改过时间会变化)
                        $FileTime = $yyyymd
                        _SendMail()    ;如果修改过则以此文件作为附件发送邮件
        EndIf
        Sleep(10000) ;10秒钟检查一次文件
WEnd
发表于 2010-11-11 09:24:50 | 显示全部楼层
注释1行、11行看看
 楼主| 发表于 2010-11-11 10:32:59 | 显示全部楼层
谢谢3mile,是发送邮件的问题。现在知道如何处理了:)
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-14 20:02 , Processed in 0.086674 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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