以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  关于文件监视  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=193133)

--  作者:fvcfox
--  发布时间:2024/8/20 14:30:00
--  关于文件监视
在文件监视,设置D:\\aa
FileChanged发现一点问题
对EXCEL 97-2003的文件修改会执行,但对其他版本生成EXCEL的文件修改没执行。还有WORD的文件也不执行


--  作者:有点蓝
--  发布时间:2024/8/20 15:41:00
--  
这种没有办法,新版office文件比较特殊,理论上就是一个压缩包,把后缀名改为zip就可以看出来。

跟踪xlsx文件的使用就可以看到,首先文件打开后,会创建一些隐藏的临时文件,然后后续的操作都是先对临时文件进行处理,然后在使用过程中execl进程会一直锁定这些文件,导致其它程序无法使用,也就无法判断。

下面是一些操作记录,可以看到保存时操作的是一些临时文件,而文件名称都是随机值,没有办法判断原来是什么文件
FileCreated=D:\\aa\\test.xlsx \'新建一个文件时触发
FileCreated=D:\\aa\\~$test.xlsx \'打开文件时触发
FileDeleted=D:\\aa\\F4D08871.tmp \'保存时触发
FileCreated=D:\\aa\\70526340 \'保存时触发

--  作者:fvcfox
--  发布时间:2024/8/20 16:09:00
--  
目前我是使用如下方法判断文件的修改情况的,但有个缺点就是占内存
If DataTables("dbupdate").DataRows.Count > 0 Then
            For Each dr As DataRow In DataTables("dbupdate").DataRows 
                System.Threading.Thread.Sleep(500)
                Dim tb As Table = Tables(dr("所在表"))
                Dim ifo As New FileInfo(dr("nf"))
                dr("更新时间") = cstr(ifo.LastWriteTime)
                If FileisOpened(dr("nf")) = False Then
                    If FileOpened(dr("nf")) = False Then
                        If dr("更新时间") > dr("登记时间") And dr("不上传") = False Then
                            Try
                                tb.DataTable.ReplaceFor ("文件时间" , CStr(ifo.LastWriteTime), "服务器文件名=\'" & dr("服务器文件名") & "\'")
                                If ftp1.Upload (dr("nf"), dr("类别") & dr("服务器文件名"), True) = True Then
                                    tb.DataTable.ReplaceFor ("不上传" , False , "服务器文件名=\'" & dr("服务器文件名") & "\'")
                                End If
                                dr.Delete
                                DataTables("dbupdate").Save
                            Catch ex As Exception 
                                
                            End Try
                        ElseIf dr("更新时间") = dr("登记时间") Then
                            dr.Delete
                            DataTables("dbupdate").Save
                        End If
                    End If 
                End If
            Next
        Else
            MyTimers("监视flup").Enabled = False
        End if