Simple implementation of an SPTimerJob which moves all files in a specified folder to another, prefixing the filenames with a timestamp. The interval is set to every minute.
1. Create a new empty SharePoint 2010 project
2. Create the following class (make sure the folders specified have been created:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Administration;
using System.IO;
namespace HotFolderJob
{
public class FileMoverJob : SPJobDefinition
{
#region Constructors
//Constructor
public FileMoverJob() : base() { }
//Constructor
public FileMoverJob(string name, SPWebApplication webApp) :
base(name, webApp, null, SPJobLockType.ContentDatabase) { this.Title = "Hotfolder Timer Job"; }
#endregion Constructors
#region Methods - Overridden
public override void Execute(Guid targetInstanceId)
{
const string sourcePath = @"C:\TimerJob\DropFolder";
const string targetPath = @"C:\TimerJob\TargetFolder";
if (System.IO.Directory.Exists(sourcePath))
{
string[] fullPathFiles = System.IO.Directory.GetFiles(sourcePath);
foreach (string fullPathfile in fullPathFiles)
{
var originalFileName = Path.GetFileName(fullPathfile);
var destFile = Path.Combine(targetPath, (string.Format("{0:yyMMdd_Hmmss}_", DateTime.Now) + originalFileName));
File.Move(fullPathfile, destFile);
//File.Copy(fullPathfile, destFile);
}
}
}
#endregion Methods - Overridden
}
}3. Add a feature, name it as you please
4. Add an event receiver to it and define the activated/deactivated methods as follows:
using System;
using System.Runtime.InteropServices;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Administration;
namespace HotFolderJob.Features.HotfolderFeature
{
[Guid("a2bb921d-dda5-4f0c-923c-da8004a4b09a")]
public class HotfolderFeatureEventReceiver : SPFeatureReceiver
{
const string JOB_NAME = "HotFolderJob";
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite site = properties.Feature.Parent as SPSite;
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == JOB_NAME)
job.Delete();
}
FileMoverJob fileMoverJob = new FileMoverJob(JOB_NAME, site.WebApplication);
SPMinuteSchedule schedule = new SPMinuteSchedule();
schedule.BeginSecond = 0;
schedule.EndSecond = 59;
schedule.Interval = 1;
fileMoverJob.Schedule = schedule;
fileMoverJob.Update();
}
public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPSite site = properties.Feature.Parent as SPSite;
foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
{
if (job.Name == JOB_NAME)
job.Delete();
}
}
//public override void FeatureInstalled(SPFeatureReceiverProperties properties)
//{
//}
//public override void FeatureUninstalling(SPFeatureReceiverProperties properties)
//{
//}
//public override void FeatureUpgrading(SPFeatureReceiverProperties properties, string upgradeActionName, System.Collections.Generic.IDictionary<string, string> parameters)
//{
//}
}
}
5. Set the feature scope to Site (applies for this example)
6. Deploy and see the magic happen