मैं फ़ाइल सिस्टम सिस्टम के साथ किसी समस्या में भाग रहा हूं जब कई फ़ाइलों को देखे गए निर्देशिका में रखा जाता है। मैं फ़ाइल में जितनी जल्दी हो सके फ़ाइल को पार्स करना चाहता हूं। आम तौर पर, पहली फ़ाइल ठीक से पार्स करती है, लेकिन निर्देशिका में दूसरी फ़ाइल जोड़ना एक एक्सेस समस्या का कारण बनता है। कभी-कभी, पहली फ़ाइल भी पार्स नहीं करती है। केवल एक ही एप्लिकेशन चल रहा है और इस निर्देशिका को देख रहा है। आखिरकार, यह प्रक्रिया एकाधिक मशीनों पर चल रही होगी और वे एक साझा निर्देशिका देखेंगे, लेकिन केवल एक सर्वर प्रत्येक फ़ाइल को पार्स कर सकता है क्योंकि डेटा डेटाबेस में आयात किया जाता है और कोई प्राथमिक कुंजी नहीं होती है।फ़ाइलसिस्टम वाटर के साथ फ़ाइल एक्सेस त्रुटि जब निर्देशिका में एकाधिक फ़ाइलों को जोड़ा जाता है
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
तो विधि उस फ़ाइल को पार्स करता है:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
जब दूसरी फ़ाइल चलती है, यह बढ़ रहा है
System.IO
यहाँ FileSystemWatcher कोड है I.OException: प्रक्रिया फ़ाइल 'C: \ Temp \ TestFile.txt' तक नहीं पहुंच सकती है क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।
यदि यह एकाधिक मशीनों पर चल रहा था, तो मैं यह त्रुटि देखने की उम्मीद करूंगा, लेकिन यह केवल एक सर्वर पर चल रहा है। इस फ़ाइल का उपयोग करके एक और प्रक्रिया नहीं होनी चाहिए - मैंने उन्हें बनाया है और जब एप्लिकेशन चल रहा है तो उन्हें निर्देशिका में कॉपी कर सकते हैं।
क्या यह फ़ाइल सिस्टम सिस्टम स्थापित करने का उचित तरीका है? मैं कैसे देख सकता हूं कि इस फाइल पर लॉक क्या है? यह दोनों फ़ाइलों को पार्स क्यों नहीं करता है - क्या मुझे फ़ाइलस्ट्रीम बंद करना है? मैं FileShare.None विकल्प रखना चाहता हूं क्योंकि मैं केवल एक सर्वर को फ़ाइल को पार्स करना चाहता हूं - जो फ़ाइल फ़ाइल में आता है वह पहले इसे पार करता है।
ये परीक्षण फ़ाइलें छोटी हैं - छोटी पाठ की केवल कुछ पंक्तियां हैं, इसलिए इसे प्रतिलिपि के दौरान बहुत लंबे समय तक लॉक नहीं किया जाना चाहिए। मैं यह जांचने के लिए लूप कैसे करूं कि फ़ाइल लिखने के लिए तैयार है या नहीं? –
धन्यवाद! मुझे शर्म आती है कि मैं इसके समाधान के रूप में थोड़ी देर के लूप के बारे में नहीं सोच सकता था - मुझे किसी अन्य ऐप की आउटपुट फ़ाइल का अद्यतन संस्करण पढ़ने की जरूरत थी। मुझे प्रति लिखने के लिए कई कार्यक्रम मिलते हैं - इसलिए मैंने एक टाइमर का उपयोग किया जो हर बार रीसेट होता है और अद्यतन फ़ाइल को पढ़ने वाले कोड को ट्रिगर करने से पहले एक्स सेकेंड के लिए प्रतीक्षा करता है। लेकिन अगर ऐप एक्स सेकेंड के भीतर दो बार लिखा गया तो मुझे अपडेट याद आया। – Gishu
+1 लेकिन आपको वास्तव में प्रतीक्षा करने के लिए अधिकतम समय होना चाहिए ताकि प्रक्रिया हमेशा के लिए लॉक न हो –