Aquí está la lógica que estoy intentando código:FileSystemWatcher se dispara antes de que se guarde el archivo. ¿Cómo se "pausa" el proceso?
El servicio supervisa un archivo .pptx en el directorio. Si el archivo ha cambiado, realice la conversión a jpg. Luego haga otras tareas, que se agregarán más tarde.
Estoy usando el archivo wather object pero eso se dispara tan pronto como abro el archivo, así que pensé en detener el proceso comprobando si el archivo está "bloqueado". Pensé que un bucle "bloqueado" haría el truco, pero no. A continuación, se muestra un prototipo de código reducido y me gustaría que, si lo mira, sugiera lo que estoy haciendo mal y/o si hay una forma mejor de escribir esto para un entorno de producción. El archivo pptx puede estar abierto durante mucho tiempo.
namespace FileWatcherDemo
{
public class Program
{
static void Main(string[] args)
{
FileSystemWatcher fsWatcher = new FileSystemWatcher();
fsWatcher.Path = @"e:\\";
fsWatcher.NotifyFilter = NotifyFilters.LastWrite;
fsWatcher.Filter = "*.pptx";
fsWatcher.Changed += new FileSystemEventHandler(fsWatcher_Changed);
//fsWatcher.Created += new FileSystemEventHandler(fsWatcher_Changed);
//fsWatcher.Deleted += new FileSystemEventHandler(fsWatcher_Changed);
//fsWatcher.Renamed += new RenamedEventHandler(fsWatcher_Changed);
fsWatcher.EnableRaisingEvents = true;
Console.ReadKey();
}
static void fsWatcher_Changed(object sender, FileSystemEventArgs e)
{
try
{
while(!IsFileLocked())
{
Console.WriteLine("Changed Event Fired");
Microsoft.Office.Interop.PowerPoint.Application app = new Microsoft.Office.Interop.PowerPoint.Application();
Presentation pptPresentation = app.Presentations.Open(@"e:\\HowTo.pptx", MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
pptPresentation.SaveAs(@"e:\\Output", PpSaveAsFileType.ppSaveAsJPG, MsoTriState.msoFalse);
pptPresentation.Close();
}
}
catch (Exception ex)
{
using (StreamWriter w = File.AppendText(@"e:\\ErrorLog.txt"))
{
Log(ex.Message.ToString(), w);
Log(ex.StackTrace.ToString(), w);
w.Close();
}
}
Console.ReadKey();
}
static bool IsFileLocked()
{
FileStream fs = null;
FileInfo file = new FileInfo(@"e:\\HowTo.pptx");
try
{
fs = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
catch (IOException)
{
return true;
}
finally
{
if(fs != null)
fs.Close();
}
return false;
}
public static void Log(string LogMessage, TextWriter w)
{
w.Write("\r\nLog Entry: ");
w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(), DateTime.Now.ToLongDateString());
w.WriteLine(" :");
w.WriteLine(" {0}", LogMessage.ToString());
w.WriteLine("------------------------------------------");
w.Flush();
}
}
}
Sí, dislplays LastAccesTime de FileInfo la verdad ellos tiempo que no es el momento actual y eso es lo que quiero. Sin embargo, no hay una propiedad que rastree el cambio. ¿Cómo pruebas para eso? Gracias. – Risho
@Risho No sé por qué dices que no hay ninguna propiedad que rastree el cambio. Estoy editando mi respuesta con un código de muestra. Pude monitorear un evento de cambio en un archivo y el tiempo que DID de hecho aumentó cada vez que se modificó el archivo. – Icarus
porque todos los métodos fsw_ se activan tan pronto como hago clic en el archivo no cuando se guarda el archivo. Tengo que dar cuenta del hecho de que el archivo puede abrir durante horas. – Risho