e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
100 lines
3.7 KiB
C#
100 lines
3.7 KiB
C#
//------------------------------------------------------------------------------
|
|
// <copyright file="TimeStampChecker.cs" company="Microsoft">
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
// </copyright>
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace System.Web.Compilation {
|
|
|
|
using System;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using System.Web;
|
|
using System.Web.Hosting;
|
|
using Debug = System.Web.Util.Debug;
|
|
|
|
internal class TimeStampChecker {
|
|
internal const String CallContextSlotName = "TSC";
|
|
|
|
private Hashtable _timeStamps = new Hashtable(StringComparer.OrdinalIgnoreCase);
|
|
|
|
private static TimeStampChecker Current {
|
|
get {
|
|
TimeStampChecker tsc = (TimeStampChecker)System.Runtime.Remoting.Messaging.CallContext.GetData(
|
|
CallContextSlotName) as TimeStampChecker;
|
|
|
|
// Create it on demand
|
|
if (tsc == null) {
|
|
tsc = new TimeStampChecker();
|
|
Debug.Trace("TimeStampChecker", "Creating new TimeStampChecker");
|
|
System.Runtime.Remoting.Messaging.CallContext.SetData(CallContextSlotName, tsc);
|
|
}
|
|
|
|
return tsc;
|
|
}
|
|
}
|
|
|
|
internal static void AddFile(string virtualPath, string path) {
|
|
Current.AddFileInternal(virtualPath, path);
|
|
}
|
|
|
|
private void AddFileInternal(string virtualPath, string path) {
|
|
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
|
|
|
|
if (_timeStamps.Contains(virtualPath)) {
|
|
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
|
|
|
|
// Already found to have changed before
|
|
if (storedValue == DateTime.MaxValue) {
|
|
Debug.Trace("TimeStampChecker", "AddFileInternal: Same time stamp (" + path + ")");
|
|
return;
|
|
}
|
|
|
|
// If it's different, set it to MaxValue as marker of being invalid
|
|
if (storedValue != lastWriteTimeUtc) {
|
|
_timeStamps[virtualPath] = DateTime.MaxValue;
|
|
Debug.Trace("TimeStampChecker", "AddFileInternal: Changed time stamp (" + path + ")");
|
|
}
|
|
}
|
|
else {
|
|
// New path: just add it
|
|
_timeStamps[virtualPath] = lastWriteTimeUtc;
|
|
Debug.Trace("TimeStampChecker", "AddFileInternal: New path (" + path + ")");
|
|
}
|
|
}
|
|
|
|
internal static bool CheckFilesStillValid(string key, ICollection virtualPaths) {
|
|
if (virtualPaths == null)
|
|
return true;
|
|
|
|
return Current.CheckFilesStillValidInternal(key, virtualPaths);
|
|
}
|
|
|
|
private bool CheckFilesStillValidInternal(string key, ICollection virtualPaths) {
|
|
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ")");
|
|
|
|
foreach (string virtualPath in virtualPaths) {
|
|
|
|
if (!_timeStamps.Contains(virtualPath))
|
|
continue;
|
|
|
|
string path = HostingEnvironment.MapPath(virtualPath);
|
|
|
|
DateTime lastWriteTimeUtc = File.GetLastWriteTimeUtc(path);
|
|
DateTime storedValue = (DateTime)_timeStamps[virtualPath];
|
|
|
|
// If it changed, then it's not valid
|
|
if (lastWriteTimeUtc != storedValue) {
|
|
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal: File (" + path + ") has changed!");
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
Debug.Trace("TimeStampChecker", "CheckFilesStillValidInternal (" + key + ") is still valid");
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|