2011-08-26 12 views
6

यहां तर्क है कि मैं कोड का प्रयास कर रहा हूं:फाइलसिस्टम वाटर फ़ंक्शन से पहले आग लग जाती है - आप प्रक्रिया को "रोकें" कैसे करते हैं?

सेवा निर्देशिका में एक .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(); 
    } 
} 

}

उत्तर

2

यहाँ एक अन्य विचार है: FileSystemWatcher परिवर्तन का पता लगाता है (आप इसे आग तुरंत फ़ाइल को खोलने पर कहते हैं) फ़ाइल का LastModifiedTime रिकॉर्ड और फ़ाइल में बदलाव की LastModifiedTime जब तक पाशन रखना (LastModifiedTime को मानते समय फ़ाइल केवल सहेजी जाती है - मुझे नहीं पता कि यह वास्तव में कब किया जाता है) और फिर जेपीजी में कनवर्ट करने की अपनी प्रक्रिया को निष्पादित करें।

संपादित

कोड जब किसी फ़ाइल संशोधित किया गया है ट्रैक करने के लिए कैसे प्रदर्शित करना चाहिए कि जोड़ना:

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); 
    } 
} 
+0

हाँ, FileInfo के LastAccesTime dislplays वास्तव में उन्हें समय जो वर्तमान समय नहीं है और है कि मैं क्या चाहते हो। ऐसी कोई संपत्ति नहीं है जो परिवर्तन को ट्रैक करे। आप इसके लिए कैसे परीक्षण करते हैं? धन्यवाद। – Risho

+0

@ ऋषो मुझे नहीं पता कि आप क्यों कहते हैं कि कोई ऐसी संपत्ति नहीं है जो परिवर्तन को ट्रैक करे। मैं नमूना कोड के साथ अपना जवाब संपादित कर रहा हूं। मैं एक फ़ाइल पर एक परिवर्तन घटना की निगरानी करने में सक्षम था और समय जब फ़ाइल संशोधित किया गया था, वास्तव में डीआईडी ​​वास्तव में बढ़ता था। – Icarus

+0

फाइलों को सहेजने पर फ़ाइल पर क्लिक करने के बाद जितनी जल्दी मैं fsw_ विधियों को आग लगाना चाहता हूं। मुझे इस तथ्य के लिए जिम्मेदार होना है कि फाइल घंटों तक खुल सकती है। – Risho

1

तर्क की एक बड़ी राशि के लिए FileSystemWatcher उपयुक्त बनाने के लिए करने के लिए अपने की जरूरत है उत्पादन-स्तर कोड।

  • आप ईवेंट हैंडलर्स बहुत हल्का रखने के लिए, बस उस कुछ हुआ और फिर इसे बाद में की प्रक्रिया कतार चाहते हैं।

  • 1000ms की देरी के साथ कतार कार्रवाई करने के लिए, जब आप एक घटना हो, बंद करो/टाइमर शुरू एक टाइमर का उपयोग करें (System.Threading सबसे अच्छा है)।

  • उसी फ़ाइल के लिए एकाधिक ईवेंट के लिए कतार की जांच करें, उदा। एक प्रोग्राम एक फाइल बना सकता है और फिर इसे फिर से हटा सकता है।

संपादित करें: मैं सिर्फ एक त्वरित गूगल खोज किया था और एक लेख और नमूना कोड है कि आप 90% वहाँ मिल जाएगा पाया।

http://csharp-codesamples.com/2009/02/file-system-watcher-and-large-file-volumes/

http://web.archive.org/web/20120814142626/http://csharp-codesamples.com/2009/02/file-system-watcher-and-large-file-volumes/

संपादित करें 2: बस अपने सवाल फिर से पढ़ें। अभी भी ऊपर सलाह लागू होता है, लेकिन कुछ और बातें आप अपनी समस्या को हल करने के लिए के लिए:

  • पावरपोइंट, अन्य कार्यालय अनुप्रयोगों की तरह, एक ~ उपसर्ग के साथ एक छिपा हुआ अस्थायी फ़ाइल बनाता है।

  • फ़ाइल संशोधन समय टिकटों की जांच करें।जब आप पहली बार नोटिस करते हैं कि एक फ़ाइल बदल गई है, तो संशोधन समय बचाएं और फ़ाइल के बदले अगली बार इसकी तुलना करें।

  • वहाँ एक फाइल सिस्टम द्रष्टा है कि आप संशोधन समय परिवर्तन प्राप्त करने के लिए सेट करने की आवश्यकता होगी के कुछ झंडा संपत्ति है।

आशा यह सब में मदद करता है ...

+0

लिंक टूटा हुआ है। – SuperJMN

+0

@SuperJMN, रिपोर्टिंग के लिए धन्यवाद। मैंने संग्रह से एक प्रति के साथ लिंक तय कर दिया है। – Dennis

संबंधित मुद्दे