예제 #1
0
        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);
        }
예제 #2
0
 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);
     }
 }
예제 #3
0
        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}
                   };
        }
예제 #4
0
 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);
                 }
             }
         }
     }
 }
예제 #5
0
 /// <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);
     }
 }
예제 #6
0
 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]);
     }
 }
예제 #7
0
 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);
     }
 }
예제 #8
0
 public Output(ArchiveTask archiveTask)
 {
     this.archiveTask = archiveTask;
 }