Ris*_*sho 6 c# io multithreading
这是我正在尝试代码的逻辑:
服务监视目录中的.pptx文件.如果文件已更改,请执行转换为jpg.然后执行其他任务,稍后将添加.
我正在使用文件wather对象,但是一打开文件就会触发,所以我想通过检查文件是否"锁定"来停止该过程.我认为"锁定时"循环可以解决问题 - 但不是.下面是简化的代码原型,如果你能看一下,我就会知道我做错了什么和/或是否有更好的方法来为生产环境编写这个.pptx文件可以打开很长时间.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
}
这是另一种想法:当 FileSystemWatcher 检测到更改(您说它在打开文件时立即触发)时,记录文件的 LastModifiedTime 并保持循环,直到文件的 LastModifiedTime 更改(假设仅在保存文件时才写入 LastModifiedTime) - 我不知道这实际上是什么时候完成的),然后执行转换为 JPG 的过程。
编辑
添加应该演示如何跟踪文件何时被修改的代码:
class Program
{
static void Main(string[] args)
{
Thread t = new Thread(()=> DoTest());
t.Start();
Console.WriteLine("Waiting...");
Console.ReadKey();
}
private static void DoTest()
{
FileSystemWatcher fsw = new FileSystemWatcher("C:\\");
fsw.Filter = "*.txt";
fsw.Changed += new FileSystemEventHandler(fsw_Changed);
fsw.Deleted += new FileSystemEventHandler(fsw_Deleted);
fsw.Renamed += new RenamedEventHandler(fsw_Renamed);
fsw.Created += new FileSystemEventHandler(fsw_Created);
fsw.EnableRaisingEvents = true;
}
static void fsw_Created(object sender, FileSystemEventArgs e)
{
FileInfo fi = new FileInfo(e.FullPath);
Console.WriteLine("File Created: "+e.FullPath);
Console.WriteLine("Creation Time: " + fi.CreationTime.ToLongTimeString());
Console.WriteLine("Last Access Time: " + fi.LastAccessTime.ToLongTimeString());
Console.WriteLine("Last Write Time: " + fi.LastWriteTime.ToLongTimeString());
Console.WriteLine("Length: " + fi.Length);
}
static void fsw_Renamed(object sender, RenamedEventArgs e)
{
FileInfo fi = new FileInfo(e.FullPath);
Console.WriteLine("File Renamed: "+e.FullPath);
Console.WriteLine("Creation Time: " + fi.CreationTime.ToLongTimeString());
Console.WriteLine("Access Time: " + fi.LastAccessTime.ToLongTimeString());
Console.WriteLine("Last Write Time: " + fi.LastWriteTime.ToLongTimeString());
Console.WriteLine("Length: " + fi.Length);
}
static void fsw_Deleted(object sender, FileSystemEventArgs e)
{
FileInfo fi = new FileInfo(e.FullPath);
Console.WriteLine("File Deleted: "+e.FullPath);
Console.WriteLine("Creation Time: " + fi.CreationTime.ToLongTimeString());
Console.WriteLine("Last Access Time: " + fi.LastAccessTime.ToLongTimeString());
Console.WriteLine("Last Write Time: " + fi.LastWriteTime.ToLongTimeString());
}
static void fsw_Changed(object sender, FileSystemEventArgs e)
{
FileInfo fi = new FileInfo(e.FullPath);
Console.WriteLine("File Changed: "+e.FullPath);
Console.WriteLine("Creation Time: " + fi.CreationTime.ToLongTimeString());
Console.WriteLine("Last Access Time: " + fi.LastAccessTime.ToLongTimeString());
Console.WriteLine("Last Write Time: " + fi.LastWriteTime.ToLongTimeString());
Console.WriteLine("Length: " + fi.Length);
}
}
Run Code Online (Sandbox Code Playgroud)