时间区间的计算

numen_wlm 2008-05-05 01:56:59
现有如下的需求:
比如在D盘根目录下有一个log文件夹,这个文件夹中存放的都是我的一个应用程序的日志文件,日志文件的格式为"模块名+日期",日期格式为yyyymmmdd的,这样的文件有很多。
现在要求是:定期自动删除文件,删除的规则比较简单(下面为规则),但是小弟是初学vb不久,不知道如何计算
规则:比如现在的log文件夹下的日志文件有下面这些,要求只保留最近7天的日志文件(日志文件并不一定是按日期连续的,可能某天并没有日志产生)
Test20080417.log
Test20080418.log
Test20080419.log
Test20080420.log
Test20080421.log
Test20080422.log
Test20080424.log
Test20080425.log
Test20080428.log
Test20080429.log
Test20080430.log
Test20080501.log
Test20080502.log
Test20080503.log
Test20080504.log
Test20080505.log
...全文
194 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
嗯,多谢各位的热情帮助,结贴给分了,大家匀一匀,呵呵
cbm6666 2008-05-05
  • 打赏
  • 举报
回复
如果每天都关机则在 Form_Load时做, 如都不关机则判断是否隔天, 或弄个图标或按钮想删就删.
舉杯邀明月 2008-05-05
  • 打赏
  • 举报
回复
你每天只会创建一个“输出日志”,也就每天只删除一回。
舉杯邀明月 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 numen_wlm 的回复:]
引用 12 楼 Chen8013 的回复:
在每次创建“输出日志”时删除一下。这样被删除的文件通常只有一两个。

嗯,你的意思是指在每次调用日志输出的function的时候都进行一次吗?这样的话我觉得好像太频繁了,因为这个函数在每个模块里面会被调用N多次,如果每次都进行这样一个操作的话,好像太浪费了,呵呵.
[/Quote]

你把关键字弄偏了,呵呵。
在每次创建“输出日志”删除一下

你在“输出时”调用,那当然太频繁啦。
Tiger_Zhao 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 numen_wlm 的回复:]
另外,还有个问题希望探讨一下,因为这些模块是vb6的一些ocx或dll文件,日志输出的function也是在这些模块里面,这些模块都是被.net那边调起来的,这样的一个删除操作的话,我应该在什么样的时机来进行?怎样才是一个高效简洁的做法?
[/Quote]
程序启动时、程序退出时。
如果程序是一直运行不关闭的,那么每天调用一次。
cbm6666 2008-05-05
  • 打赏
  • 举报
回复
帮你完善一下吧, 这个代码所有的 .log文件是在你的 app.path 下面,如果不是的话自己改一下
使用List排序最方便了,因为你的文件命名方式很规范, 非常好的习惯, 当然不用List1排序用数组排序也行,
但是因你的数据量庞大的话,使用List1排序效率会较高.

'添加 Command1 List1 (List1的sorted设为True)

Option Explicit
Dim i&, Appdisk$, Fnm$

Private Sub Form_Load()
Appdisk = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
Fnm = Dir(Appdisk & "*.log")
List1.Visible = False '暂时隐藏的话效率较高
Do While Len(Fnm) > 0
List1.AddItem Appdisk & Fnm
Fnm = Dir
Loop
List1.Visible = True
End Sub

Private Sub Command1_Click()
If List1.ListCount > 7 Then '保留7笔所以有大于7笔才执行删除
For i = List1.ListCount - 8 To 0 Step -1
Kill List1.List(i) '删除文件
List1.RemoveItem i
Next i
MsgBox "清除完成"
End If
End Sub

numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Chen8013 的回复:]
在每次创建“输出日志”时删除一下。这样被删除的文件通常只有一两个。
[/Quote]
嗯,你的意思是指在每次调用日志输出的function的时候都进行一次吗?这样的话我觉得好像太频繁了,因为这个函数在每个模块里面会被调用N多次,如果每次都进行这样一个操作的话,好像太浪费了,呵呵.
舉杯邀明月 2008-05-05
  • 打赏
  • 举报
回复
在每次创建“输出日志”时删除一下。这样被删除的文件通常只有一两个。
numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
谢谢楼上各位热心的回复,我大概知道怎么做了。
另外,还有个问题希望探讨一下,因为这些模块是vb6的一些ocx或dll文件,日志输出的function也是在这些模块里面,这些模块都是被.net那边调起来的,这样的一个删除操作的话,我应该在什么样的时机来进行?怎样才是一个高效简洁的做法?
舉杯邀明月 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lsftest 的回复:]
如果你的文件很多,用循环一个一个删不一定合适。。
一个建议:
1.确定保留的七个文件(这个试试上面各位的方案吧)
2.把这七个文件改名,最好是改后缀,例如改为Test20080417.bak之类。。
3.删除文件夹内所有后缀为log的文件,dos行,fso行,wmi也行方法随你喜欢例如用dos就一句del d:\log\*.log
4.把刚才那7个文件名改回去。
[/Quote]

如果“经常删”,被删除的没几个文件吧? ^_^
(很有可能远少于7个)
lsftest 2008-05-05
  • 打赏
  • 举报
回复
楼主要的是最新7天记录还是最近7个记录文件?这个有很大区别。
lsftest 2008-05-05
  • 打赏
  • 举报
回复
如果你的文件很多,用循环一个一个删不一定合适。。
一个建议:
1.确定保留的七个文件(这个试试上面各位的方案吧)
2.把这七个文件改名,最好是改后缀,例如改为Test20080417.bak之类。。
3.删除文件夹内所有后缀为log的文件,dos行,fso行,wmi也行方法随你喜欢例如用dos就一句del d:\log\*.log
4.把刚才那7个文件名改回去。
舉杯邀明月 2008-05-05
  • 打赏
  • 举报
回复
Sub DelLogFile(ByVal strPath$)

Dim lDelDate&, lFileDate&, strFile$, strDate$
If (Asc(Right$(strPath, 1)) <> 92) Then strPath = strPath & "\"
lDelDate = Int(Now()) - 6
strFile = Dir$(strPath & "*.log")
Do While (Len(strFile) > 0)
strDate = Left$(Right$(strFile, 12), 8)
If (Len(strDate) = 8) Then
If (Val(strDate) > 0) Then
lFileDate = CDate(Format$(strDate, "0000-00-00"))
If (lFileDate < lDelDate) Then
Kill strPath & strFile
End If
End If
End If
strFile = Dir$()
Loop

End Sub

Tiger_Zhao 2008-05-05
  • 打赏
  • 举报
回复
Option Explicit

Sub Main()
Dim dt As Date, sFileName As String, sOldFileName As String
dt = Date - 7
sOldFileName = "Test" & Format$(dt, "yyyymmdd") & ".log"

sFileName = Dir("D:\Log\*.log")
While LenB(sFileName) <> 0
If (sFileName Like "Test########.log") And (sFileName <= sOldFileName) Then
Kill "D:\Log\" & sFileName
End If
sFileName = Dir()
Wend
End Sub
cbm6666 2008-05-05
  • 打赏
  • 举报
回复
最简单的就是例用 List1的 Sorted排序属性 将它设为 True

下面代码头只是给你方法与思路, 你活用一下即可

'添加 Command1 List1 (List1的sorted设为True)

Dim i&, RndNum%, appdisk$

Private Sub Form_Load()
appdisk = IIf(Right(App.Path, 1) = "\", App.Path, App.Path & "\")
Randomize
For i = 1 To 20
RndNum = Int(Rnd * 31) + 1 '这里只是举例别管该月有几天
List1.AddItem "test" & Mid(Date$, 1, 4) & Mid(Date$, 6, 2) & Format(CStr(RndNum), "00") & ".log"
Next i
End Sub

Private Sub Command1_Click()
For i = List1.ListCount - 8 To 0 Step -1
'kill appdisk & list1.list(i) '删除文件
List1.RemoveItem i
Next i
End Sub
numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
或者是我理解错了你的意思?呵呵,我对VB的很多地方的用法还不熟悉,可不可以讲的详细点,最好用代码说话,谢谢
numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Tiger_Zhao 的回复:]
当前为:#2008-5-5#
7天之前就是:#2008-5-5# - 7 = #2008-04-28#
那么只要符合一下命名的文件都需要删除:(文件名 Like "Test########.log") And (文件名 <= "Test20080428.log")
[/Quote]
谢谢楼上的回复,不过这个不是在DB中删除记录,是删除硬盘上的文件。
Tiger_Zhao 2008-05-05
  • 打赏
  • 举报
回复
当前为:#2008-5-5#
7天之前就是:#2008-5-5# - 7 = #2008-04-28#
那么只要符合一下命名的文件都需要删除:(文件名 Like "Test########.log") And (文件名 <= "Test20080428.log")
numen_wlm 2008-05-05
  • 打赏
  • 举报
回复
up

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧