private void ReceivedConvert(BitmapConverterMessage.Convert message) { string[] targetFiles = Directory.GetFiles(this.folder, this.filefilter); log.Info("Found {0} files to convert ({1})", targetFiles.Length, this.filefilter); // note: we could use child actors to do the actual conversion and a pool router to limit the concurrency of that - but I guess we only process screenshots of one player actually ;) foreach (var targetFile in targetFiles) { try { string converterFilename = Path.ChangeExtension(targetFile, "png"); using (var image = Image.FromFile(targetFile)) { if (File.Exists(converterFilename)) { log.Warning("Skipping to convert {0} because it seems to already exist!", targetFile); continue; } image.Save(converterFilename, ImageFormat.Png); log.Info("Saved: {0}", converterFilename); } File.Delete(targetFile); this.processor.Tell(new BitmapConverterMessage.SuccessNotification(converterFilename)); } catch (Exception ex) { log.Error(ex, "Failed to convert: {0}", targetFile); this.processor.Tell(new BitmapConverterMessage.FailureNotification(ex.Message, targetFile)); } } }
protected override void PreStart() { this.fileSystemWatcher = new FileSystemWatcher() { Path = this.folder, Filter = this.filefilter, EnableRaisingEvents = false, }; IActorRef self = Self; BitmapConverterMessage.Convert convertMessage = new BitmapConverterMessage.Convert(); this.fileSystemWatcher.Changed += new FileSystemEventHandler((sender, e) => { self.Tell(convertMessage); }); this.subIntervalConvert = Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(INTERVAL_SCAN, INTERVAL_SCAN, Self, new BitmapConverterMessage.Convert(), Self); }