यहां तर्क है कि मैं कोड का प्रयास कर रहा हूं:फाइलसिस्टम वाटर फ़ंक्शन से पहले आग लग जाती है - आप प्रक्रिया को "रोकें" कैसे करते हैं?
सेवा निर्देशिका में एक .pptx फ़ाइल पर नज़र रखता है। अगर फ़ाइल बदल गई है तो jpg में कनवर्टन करें। फिर अन्य कार्य करें, जिन्हें बाद में जोड़ा जाएगा।
मैं फ़ाइल वादर ऑब्जेक्ट का उपयोग कर रहा हूं लेकिन जैसे ही मैं फ़ाइल खोलता हूं, इसलिए मैंने प्रक्रिया को रोककर सोचा कि फ़ाइल "लॉक" है या नहीं। मैंने सोचा कि "लॉक होने पर" लूप चाल करेगा - लेकिन नहीं। नीचे कोड प्रोटोटाइप कम हो गया है और मैं woiuld की तरह यह देख सकता हूं कि आप यह देख सकते हैं कि मैं क्या गलत कर रहा हूं और/या यदि उत्पादन वातावरण के लिए इसे लिखने का एक बेहतर तरीका है। पीपीटीएक्स फ़ाइल लंबे समय तक खुली हो सकती है।
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();
}
}
}
हाँ, FileInfo के LastAccesTime dislplays वास्तव में उन्हें समय जो वर्तमान समय नहीं है और है कि मैं क्या चाहते हो। ऐसी कोई संपत्ति नहीं है जो परिवर्तन को ट्रैक करे। आप इसके लिए कैसे परीक्षण करते हैं? धन्यवाद। – Risho
@ ऋषो मुझे नहीं पता कि आप क्यों कहते हैं कि कोई ऐसी संपत्ति नहीं है जो परिवर्तन को ट्रैक करे। मैं नमूना कोड के साथ अपना जवाब संपादित कर रहा हूं। मैं एक फ़ाइल पर एक परिवर्तन घटना की निगरानी करने में सक्षम था और समय जब फ़ाइल संशोधित किया गया था, वास्तव में डीआईडी वास्तव में बढ़ता था। – Icarus
फाइलों को सहेजने पर फ़ाइल पर क्लिक करने के बाद जितनी जल्दी मैं fsw_ विधियों को आग लगाना चाहता हूं। मुझे इस तथ्य के लिए जिम्मेदार होना है कि फाइल घंटों तक खुल सकती है। – Risho