मेरे पास एक ऐप है, एक चुने हुए फ़ोल्डर में * .log फ़ाइल को सुन रहा है। मैंने FileSystemWatcher
का उपयोग किया।फ़ाइल.इक्सिस्ट तक प्रतीक्षा कैसे करें?
लेकिन एक समस्या है। उस फ़ाइल को लेने के लिए जिम्मेदार अन्य एप्लिकेशन निम्नलिखित कदम उठा लेता:
- एक * .gz फ़ाइल
- txt फ़ाइल (कुछ यादृच्छिक फ़ाइल नाम)
- बदलें उचित एक के लिए * .txt नाम में खोल दे बनाओ * .log एक्सटेंशन के साथ।
और मैं इस व्यवहार को नहीं बदल सकता।
तो मैंने * .gz, और * .txt फ़ाइलों के लिए 2 FileSystemWatcher
एस बनाया। क्यूं कर? चूंकि यह ऐप कभी-कभी gz फ़ाइल को अनपैक नहीं करता है, और कभी-कभी txt फ़ाइल को अंतिम * .log फ़ाइल में पुनर्नामित नहीं करता है।
FileSystemWatcher2
txt फ़ाइल को पकड़ता है, फिर (ज्यादातर मामलों में इसे अगले 1000ms में लॉग इन करने के लिए नामित किया जाता है) मुझे यह देखने के लिए कुछ समय इंतजार करना होगा कि txt फ़ाइल मौजूद है या नहीं (यदि नहीं, तो इसे अंतिम * ।लॉग फ़ाइल)।
सवाल यह है कि यूआई फ्रीज को रोकने के लिए फ़ाइल कैसे Thread.Sleep()
के बिना मौजूद है या नहीं?
मुझे उम्मीद है कि यह स्पष्ट है, अगर नहीं, तो मैं इसे बेहतर तरीके से वर्णन करने की कोशिश करूंगा। मुझे लगता है कि यह एक जटिल समस्या है।
कुछ कोड नमूना:
private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
//this is for gz files in case if gz file is not unpacked automatically by other app
//I need to wait and check if gz was unpacked, if not, unpack it by myself,
//then txt watcher will catch that
Thread.Sleep(5000);
if (File.Exists(e.FullPath))
{
try
{
byte[] dataBuffer = new byte[4096];
using (System.IO.Stream fs = new FileStream(e.FullPath,
FileMode.Open,
FileAccess.Read))
{
using (GZipInputStream gzipStream = new GZipInputStream(fs))
{
string fnOut = Path.Combine(path_to_watcher,
Path.GetFileNameWithoutExtension(e.FullPath));
using (FileStream fsOut = File.Create(fnOut))
{
StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
}
}
}
}
catch { //Ignore }
}
}
txt फ़ाइल के लिए चौकीदार:
GZ फ़ाइल के लिए चौकीदार
private void fileSystemWatcher2_Created(object sender, FileSystemEventArgs e)
{
//this is for txt file
Thread.Sleep(3500);
if (File.Exists(e.FullPath))
{
//make my actions
}
else
{
//make my actions
}
}
सभी 'Thread.Sleep()' करता है त्यागना धागा कंप्यूटर संसाधनों यह उपयोग कर रहा है, ताकि वे अन्य कार्यों के लिए इस्तेमाल किया जा सकता जारी:
यहाँ सबूत है।यह कुछ परिदृश्यों के लिए आदर्श नहीं है (क्योंकि इसमें 1 एमएस न्यूनतम ग्रैन्युलरिटी है) लेकिन जो भी आप पूरा करने की कोशिश कर रहे हैं, उसके लिए यह ठीक काम कर सकता है। –
@RobertHarvey क्या आपके पास इसके लिए कुछ दस्तावेज हैं? मेरे अनुभव से, थ्रेड। नींद एक थ्रेड को आगे बढ़ने तक आगे के निर्देशों को संसाधित करने से रोकती है। एमएसडीएन से: 'थ्रेड निर्दिष्ट समय की मात्रा के लिए ऑपरेटिंग सिस्टम द्वारा निष्पादन के लिए निर्धारित नहीं किया जाएगा।' – CodingGorilla
@ कोडिंग गोरिल्ला: हाँ, यह सही है। यह अन्य कार्यों के लिए थ्रेड धारण करने वाले संसाधनों को ब्लॉक करता है, और रिलीज़ करता है। यह मूल रूप से कह रहा है "मैं अगले एन मिलीसेकंड के लिए कुछ भी नहीं कर रहा हूं, इसलिए आप उस समय के दौरान कुछ और कर सकते हैं।" –