private void ArchiveByDateAndSequence(string fileName, string pattern, LogEventInfo logEvent)
{
string baseNamePattern = Path.GetFileName(pattern);
if (string.IsNullOrEmpty(baseNamePattern))
{
return;
}
string dirName = Path.GetDirectoryName(Path.GetFullPath(pattern));
if (string.IsNullOrEmpty(dirName))
{
return;
}
FileNameTemplate fileTemplate = new FileNameTemplate(baseNamePattern);
string fileNameMask = fileTemplate.ReplacePattern("*");
string dateFormat = GetArchiveDateFormatString(this.ArchiveDateFormat);
int minSequenceLength = fileTemplate.EndAt - fileTemplate.BeginAt - 2;
int nextSequenceNumber;
DateTime archiveDate = GetArchiveDate(fileName, logEvent);
List<string> archiveFileNames;
if (Directory.Exists(dirName))
{
List<DateAndSequenceArchive> archives = FindDateAndSequenceArchives(dirName, fileName, fileNameMask, minSequenceLength, dateFormat, fileTemplate)
.ToList();
// Find out the next sequence number among existing archives having the same date part as the current date.
int? lastSequenceNumber = archives
.Where(a => a.HasSameFormattedDate(archiveDate))
.Max(a => (int?)a.Sequence);
nextSequenceNumber = (int)(lastSequenceNumber != null ? lastSequenceNumber + 1 : 0);
archiveFileNames = archives
.OrderBy(a => a.Date)
.ThenBy(a => a.Sequence)
.Select(a => a.FileName)
.ToList();
}
else
{
Directory.CreateDirectory(dirName);
nextSequenceNumber = 0;
archiveFileNames = new List<string>();
}
string paddedSequence = nextSequenceNumber.ToString().PadLeft(minSequenceLength, '0');
string archiveFileNameWithoutPath = fileNameMask.Replace("*",
string.Format("{0}.{1}", archiveDate.ToString(dateFormat), paddedSequence));
string archiveFileName = Path.Combine(dirName, archiveFileNameWithoutPath);
ArchiveFile(fileName, archiveFileName);
archiveFileNames.Add(archiveFileName);
EnsureArchiveCount(archiveFileNames);
}