Đây là logic tôi đang cố gắng mã:FileSystemWatcher kích hoạt trước khi tệp được lưu - làm cách nào để bạn "tạm dừng" quá trình này?
Dịch vụ giám sát tệp .pptx trong thư mục. Nếu tệp đã thay đổi thực hiện chuyển đổi thành jpg. Sau đó thực hiện các tác vụ khác, sẽ được bổ sung sau.
Tôi đang sử dụng đối tượng thu thập tệp nhưng sẽ kích hoạt ngay sau khi tôi mở tệp, vì vậy tôi đã dừng quá trình bằng cách kiểm tra xem tệp có bị "khóa" hay không. Tôi nghĩ rằng một "trong khi bị khóa" vòng lặp sẽ làm các trick - nhưng không có. Dưới đây là nguyên mẫu mã giảm và tôi woiuld thích nếu bạn có thể nhìn vào nó cho thấy những gì tôi đang làm sai và/hoặc nếu có một cách tốt hơn để viết này cho một môi trường sản xuất. Tệp pptx có thể mở trong một thời gian dài.
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();
}
}
}
Vâng, dislplays LastAccesTime FileInfo của thực sự họ thời gian mà không phải là thời gian hiện tại và đó là những gì tôi muốn. Tuy nhiên, không có thuộc tính nào theo dõi thay đổi. Làm thế nào để bạn kiểm tra cho điều đó? Cảm ơn. – Risho
@Risho Tôi không biết tại sao bạn nói rằng không có tài sản nào theo dõi thay đổi. Tôi đang chỉnh sửa câu trả lời của mình bằng mã mẫu. Tôi đã có thể theo dõi sự kiện thay đổi trên một tệp và thời gian DID thực sự tăng lên mỗi khi tệp được sửa đổi. – Icarus
vì tất cả các phương pháp fsw_ đều kích hoạt ngay khi tôi nhấp vào tệp không khi tệp được lưu. Tôi phải tính đến thực tế là tệp có thể mở trong nhiều giờ. – Risho