-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathOperLogFileCache.cs
149 lines (135 loc) · 4.06 KB
/
OperLogFileCache.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Threading;
using System.Xml;
using DigitalPlatform.IO;
using DigitalPlatform.Xml;
using DigitalPlatform.Text;
namespace DigitalPlatform.LibraryServer
{
// 事件日志
public class OperLogFileCache : List<CacheFileItem>, IDisposable
{
internal ReaderWriterLockSlim m_lock = new ReaderWriterLockSlim();
public void Dispose()
{
this.Close();
}
// 使用
public CacheFileItem Open(string strFilename)
{
this.m_lock.EnterWriteLock();
try
{
CacheFileItem item = null;
int i = 0;
foreach (CacheFileItem cur_item in this)
{
if (cur_item.Used == false
&& cur_item.FileName == strFilename)
{
cur_item.LastTime = DateTime.Now;
cur_item.Used = true;
// 移动到数组的最前面
if (i > 10) // i > 10
{
this.Remove(cur_item);
this.Insert(0, cur_item);
}
return cur_item;
}
i++;
}
item = new CacheFileItem();
item.FileName = strFilename;
// 可能会抛出异常
item.Stream = File.Open(
strFilename,
FileMode.Open,
FileAccess.ReadWrite, // Read会造成无法打开 2007/5/22
FileShare.ReadWrite);
item.Used = true;
this.Insert(0, item); // 插入到最前面,希望后面被命中的概率大一些
item.LastTime = DateTime.Now;
return item;
}
finally
{
this.m_lock.ExitWriteLock();
}
}
// 归还
public void Close(CacheFileItem item)
{
this.m_lock.EnterWriteLock();
try
{
item.LastTime = DateTime.Now;
item.Used = false;
}
finally
{
this.m_lock.ExitWriteLock();
}
}
// 全部关闭
public void Close()
{
this.m_lock.EnterWriteLock();
try
{
foreach (CacheFileItem cur_item in this)
{
if (cur_item.Stream != null)
{
cur_item.Stream.Close();
cur_item.Stream = null;
}
}
base.Clear();
}
finally
{
this.m_lock.ExitWriteLock();
}
}
// 将不活跃的事项压缩
public void Shrink(TimeSpan delta)
{
this.m_lock.EnterWriteLock();
try
{
DateTime now = DateTime.Now;
for (int i = 0; i < this.Count; i++)
{
CacheFileItem cur_item = this[i];
if (cur_item.Used == false)
{
if (now - cur_item.LastTime > delta)
{
if (cur_item.Stream != null)
cur_item.Stream.Close();
this.RemoveAt(i);
i--;
}
}
}
}
finally
{
this.m_lock.ExitWriteLock();
}
}
}
public class CacheFileItem
{
public string FileName = "";
public Stream Stream = null; // !!! 谁来释放
public bool Used = false;
public DateTime LastTime = DateTime.Now;
}
}