public void UpdateDupe() { string releaseName = Guid.NewGuid().ToString(); string realPath = string.Format("c:\\temp\\{0}", releaseName); string virtualPath = string.Format("/temp/{0}", releaseName); string commandText = String.Format(@"INSERT INTO Folders (UserName, GroupName, ReleaseName, PathReal, PathVirtual) VALUES('jeza', 'group', '{0}', '{1}', '{2}')", releaseName, realPath, virtualPath); int numberOfRows = DataBase.Insert(commandText); Assert.AreEqual(1, numberOfRows); var directoryInfo = new DirectoryInfo(realPath); if (!directoryInfo.Exists) { directoryInfo.Create(); } var archiveTask = new ArchiveTask { DestinationVirtual = "/temp/dest/", Destination = "c:\\temp\\dest\\", SourceVirtual = "/temp", Source = "c:\\temp\\", }; DirectoryInfo parent = directoryInfo.Parent; Assert.IsNotNull(parent); string command = String.Format(Config.DataSourceDupeUpdateCommand, releaseName, realPath, virtualPath, archiveTask.DestinationVirtual, archiveTask.Destination, archiveTask.SourceVirtual, archiveTask.Source, parent.FullName); int rowsUpdated = DataBase.Update(command); Assert.AreEqual(1, rowsUpdated); }
private static void UpdateDupeDb(ArchiveTask archiveTask, DirectoryInfo directoryInfo) { try { Log.Debug("archiveTask : {0}", archiveTask.ToString()); if (!Config.UpdateDupe) { Log.Debug("Failed to get 'Config.UpdateDupe' configuration! "); return; } Log.Debug("Updating DUPEDB with '{0}'", Config.DataSourceDupeUpdateCommand); Log.Debug("DUPEDB : '{0}'", Config.DataSourceDupe); string releaseName = directoryInfo.Name; string realPath = directoryInfo.FullName; string virtualPath = String.Format("{0}/{1}", archiveTask.DestinationVirtual, releaseName); Log.Debug("releaseName='{0}', realPath='{1}', virtualPath='{2}'", releaseName, realPath, virtualPath); DirectoryInfo parent = directoryInfo.Parent; if (parent != null) { string command = String.Format(Config.DataSourceDupeUpdateCommand, releaseName, realPath, virtualPath, archiveTask.DestinationVirtual, archiveTask.Destination, archiveTask.SourceVirtual, archiveTask.Source, parent.FullName); int rowsUpdated = DataBase.Update(command); Log.Debug("{0} rows updated.", rowsUpdated); } else { Log.Debug("Failed to get parent Directory from {0}!", directoryInfo.FullName); } } catch (Exception exception) { Log.Debug("Failed to update DupeDB! {0}", exception.Message); Log.Debug("{0}", exception.StackTrace); } }
private TaskConfiguration GetArchiveConfiguration() { ArchiveTask task1 = new ArchiveTask { ArchiveStatus = ArchiveStatus.Enabled, ArchiveType = ArchiveType.Move, Source = "C:\\temp", Destination = "D:\\temp", Action = new ArchiveAction { Id = ArchiveActionAttribute.TotalUsedSpace, Value = 120 * 1024 * 1024, MinFolderAction = 10, }, }; ArchiveTask task2 = new ArchiveTask { ArchiveStatus = ArchiveStatus.Enabled, ArchiveType = ArchiveType.Delete, Source = "C:\\temp123", Destination = "D:\\temp123", Action = new ArchiveAction { Id = ArchiveActionAttribute.TotalFolderCount, Value = 999 * 1024 * 1024, MinFolderAction = 5, }, }; return new TaskConfiguration { ArchiveTasks = new[] {task1, task2, task3} }; }
private static void ManageDiskSpace(ArchiveTask task, List<DirectoryInfo> sourceFolders) { DriveInfo[] driveInfos = DriveInfo.GetDrives(); foreach (DriveInfo driveInfo in driveInfos) { if (task.Source.ToUpper().StartsWith(driveInfo.Name.ToUpper())) { if (task.Action.Id == ArchiveActionAttribute.TotalFreeSpace) { if ((UInt64) driveInfo.AvailableFreeSpace < task.Action.Value) { ExecuteArchiveTask(task, sourceFolders); } } if (task.Action.Id == ArchiveActionAttribute.TotalUsedSpace) { UInt64 usedSpace = (UInt64) driveInfo.TotalSize - (UInt64) driveInfo.TotalFreeSpace; if (usedSpace > task.Action.Value) { ExecuteArchiveTask(task, sourceFolders); } } } } }
/// <summary> /// Executes the archive task (Move or Delete). /// </summary> /// <param name="archiveTask">The archive task.</param> /// <param name="directoryInfo">Source directory.</param> private static void ExecuteArchiveTask(ArchiveTask archiveTask, DirectoryInfo directoryInfo) { Log.Debug("ExecuteArchiveTask '{0}' on '{1}'!", archiveTask.Action.Id, directoryInfo.FullName); switch (archiveTask.ArchiveType) { case ArchiveType.Copy: { CopySourceFolders(archiveTask, directoryInfo); UpdateDupeDb(archiveTask, directoryInfo); break; } case ArchiveType.Move: { CopySourceFolders(archiveTask, directoryInfo); UpdateDupeDb(archiveTask, directoryInfo); if (!sameRoot) { DeleteFolder(directoryInfo, true); } break; } case ArchiveType.Delete: { DeleteFolder(directoryInfo, true); break; } default: { throw new NotSupportedException(); } } if (!String.IsNullOrEmpty(archiveTask.LogFormat)) { var output = new Output(archiveTask); string formatArchive = output.FormatArchive(archiveTask.LogFormat, directoryInfo); Log.IoFtpd(formatArchive); Log.Internal(formatArchive); } }
private static void ExecuteArchiveTask(ArchiveTask archiveTask, List<DirectoryInfo> sourceFolders) { int currentFolderCount = sourceFolders.Count; int minFolderCountToKeep = archiveTask.Action.MinFolderAction; int howManyToRemove = currentFolderCount - minFolderCountToKeep; DirectoryInfo[] directoryInfos = sourceFolders.ToArray(); Array.Sort(directoryInfos, new CompareDirectoryByDate()); for (int i = 0; i < howManyToRemove; i++) { ExecuteArchiveTask(archiveTask, directoryInfos [i]); } }
private static void CopySourceFolders(ArchiveTask archiveTask, DirectoryInfo sourceDirectory) { var destinationDirectory = new DirectoryInfo(archiveTask.Destination); Log.Debug("Source Folder : '{0}'", sourceDirectory.FullName); Log.Debug("Destination Folder: '{0}'", destinationDirectory.FullName); sameRoot = false; if (sourceDirectory.Root.Name == destinationDirectory.Root.Name) { sameRoot = true; } const string ioftpd = ".ioFTPD"; const string ioftpdBackup = ".backup"; string sourceFileName = Misc.PathCombine(sourceDirectory.FullName, ioftpd); if (File.Exists(sourceFileName)) { string backupSource = sourceFileName + ioftpdBackup; FileInfo.DeleteFile(backupSource); File.Move(sourceFileName, backupSource); } string destinationFolder = Misc.PathCombine(destinationDirectory.FullName, sourceDirectory.Name); sourceDirectory.CopyTo(new DirectoryInfo(destinationFolder), true); string destinationFileName = Misc.PathCombine(destinationFolder, ioftpd + ioftpdBackup); if (File.Exists(destinationFileName)) { string backupDestination = Misc.PathCombine(destinationFolder, ioftpd); FileInfo.DeleteFile(backupDestination); File.Move(destinationFileName, backupDestination); } }
public Output(ArchiveTask archiveTask) { this.archiveTask = archiveTask; }