private void DeleteOldFiles()
{
bool fileschanged = false;
//walk through camera specific management first
foreach (var camobj in Cameras)
{
if (camobj.settings.storagemanagement.enabled)
{
try
{
var cw = GetCameraWindow(camobj.id);
if (cw != null)
{
bool archive = camobj.settings.storagemanagement.archive;
var d = Helper.GetMediaDirectory(2, camobj.id) + "video\\" + camobj.directory;
if (!Directory.Exists(d))
{
Logger.LogErrorToFile("Directory not found: "+d);
continue;
}
var dirinfo = new DirectoryInfo(d);
var lFi = new List<FileInfo>();
lFi.AddRange(dirinfo.GetFiles("*.*", SearchOption.AllDirectories));
lFi = lFi.FindAll(f => f.Extension != ".xml");
lFi = lFi.OrderBy(f => f.CreationTime).ToList();
var size = lFi.Sum(p => p.Length);
var targetSize = (camobj.settings.storagemanagement.maxsize) * 1048576d;
while (size > targetSize)
{
for (int i = 0; i < lFi.Count; i++)
{
var fi = lFi[i];
if (FileOperations.DeleteOrArchive(fi.FullName, archive))
{
try
{
cw.RemoveFile(fi.Name);
}
catch
{
// ignored
}
size -= fi.Length;
fileschanged = true;
lFi.Remove(fi);
i--;
if (size < targetSize)
break;
}
}
}
var targetdate = DateTime.Now.AddHours(0 - camobj.settings.storagemanagement.maxage);
lFi = lFi.FindAll(p => p.CreationTime < targetdate).ToList();
for (int i = 0; i < lFi.Count; i++)
{
var fi = lFi[i];
if (FileOperations.DeleteOrArchive(fi.FullName, archive))
{
try
{
cw.RemoveFile(fi.Name);
}
catch
{
// ignored
}
fileschanged = true;
lFi.Remove(fi);
i--;
}
}
}
}
catch (Exception ex)
{
Logger.LogExceptionToFile(ex, "DeleteOldFiles: "+ camobj.name);
}
}
}
foreach (var micobj in Microphones)
{
if (micobj.settings.storagemanagement.enabled)
{
try
{
var vl = GetVolumeLevel(micobj.id);
if (vl != null)
{
bool archive = micobj.settings.storagemanagement.archive;
var d = Helper.GetMediaDirectory(1, micobj.id) + "audio\\" + micobj.directory;
if (!Directory.Exists(d))
{
Logger.LogErrorToFile("Directory not found: " + d);
continue;
}
var dirinfo = new DirectoryInfo(d);
var lFi = new List<FileInfo>();
lFi.AddRange(dirinfo.GetFiles("*.*", SearchOption.AllDirectories));
lFi = lFi.FindAll(f => f.Extension != ".xml");
lFi = lFi.OrderBy(f => f.CreationTime).ToList();
var size = lFi.Sum(p => p.Length);
var targetSize = (micobj.settings.storagemanagement.maxsize) * 1048576d;
while (size > targetSize)
{
for (int i = 0; i < lFi.Count; i++)
{
var fi = lFi[i];
if (FileOperations.DeleteOrArchive(fi.FullName, archive))
{
try
{
vl.RemoveFile(fi.Name);
}
catch
{
// ignored
}
size -= fi.Length;
fileschanged = true;
lFi.Remove(fi);
i--;
}
}
}
var targetdate = DateTime.Now.AddHours(0 - micobj.settings.storagemanagement.maxage);
lFi = lFi.FindAll(p => p.CreationTime < targetdate).ToList();
for (int i = 0; i < lFi.Count; i++)
{
var fi = lFi[i];
if (FileOperations.DeleteOrArchive(fi.FullName, archive))
{
try
{
vl.RemoveFile(fi.Name);
}
catch
{
// ignored
}
fileschanged = true;
lFi.Remove(fi);
i--;
}
}
}
}
catch (Exception ex)
{
Logger.LogExceptionToFile(ex, "DeleteOldFiles: " + micobj.name);
}
}
}
if (fileschanged)
{
UISync.Execute(RefreshControls);
}
//run storage management on each directory
foreach (var d in Conf.MediaDirectories)
{
if (d.Enable_Storage_Management)
{
if (d.DeleteFilesOlderThanDays <= 0)
continue;
DateTime dtref = DateTime.Now.AddDays(0 - d.DeleteFilesOlderThanDays);
//don't bother if oldest file isn't past cut-off
if (_oldestFile > dtref)
continue;
var lFi = new List<FileInfo>();
try
{
var dirinfo = new DirectoryInfo(d.Entry + "video\\");
lFi.AddRange(dirinfo.GetFiles("*.*", SearchOption.AllDirectories));
dirinfo = new DirectoryInfo(d.Entry + "audio\\");
lFi.AddRange(dirinfo.GetFiles("*.*", SearchOption.AllDirectories));
}
catch (Exception ex)
{
Logger.LogExceptionToFile(ex, "DeleteOldFiles: "+d.Entry);
continue;
}
lFi = lFi.FindAll(f => f.Extension != ".xml");
lFi = lFi.OrderBy(f => f.CreationTime).ToList();
var size = lFi.Sum(p => p.Length);
var targetSize = (d.MaxMediaFolderSizeMB * 0.7) * 1048576d;
if (size < targetSize)
{
continue;
}
var lCan = lFi.Where(p => p.CreationTime < dtref).OrderBy(p => p.CreationTime).ToList();
bool archive = d.archive;
for (int i = 0; i < lCan.Count; i++)
{
var fi = lCan[i];
if (size > targetSize)
{
if (FileOperations.DeleteOrArchive(fi.FullName, archive))
{
size -= fi.Length;
fileschanged = true;
lCan.Remove(fi);
i--;
lock (ThreadLock)
{
Masterfilelist.RemoveAll(p => p.Filename.EndsWith(fi.Name));
}
if (size < targetSize)
{
break;
}
}
}
}
if (lCan.Count > 0)
_oldestFile = lCan.First().CreationTime;
else
{
var o = lFi.FirstOrDefault(p => p.CreationTime > dtref);
if (o != null)
_oldestFile = o.CreationTime;
}
if (fileschanged)
{
UISync.Execute(RefreshControls);
Logger.LogMessageToFile(LocRm.GetString("MediaStorageLimit").Replace("[AMOUNT]",
d.MaxMediaFolderSizeMB.ToString
(
CultureInfo.
InvariantCulture)));
}
if ((size / 1048576) > d.MaxMediaFolderSizeMB && !d.StopSavingFlag && d.StopSavingOnStorageLimit)
{
d.StopSavingFlag = true;
}
else
d.StopSavingFlag = false;
}
}
}