2010-09-17 22 views
9

द्वारा किया जा रहा है मैं एक प्रोग्राम है जो मोटे तौर पर ऐसा करता है:फ़ाइल किसी अन्य प्रक्रिया

  1. एक फ़ाइल खोलने से पढ़ने के लिए।
  2. फ़ाइल
  3. फ़ाइल को बंद करने के लिए फ़ाइलवॉचर प्रारंभ करें।
  4. जैसे ही एक परिवर्तन का पता चला है, filewatcher के EnableRaisingEvents ध्वज गलत पर सेट है और इस प्रक्रिया कदम से दोहराता 1.

समस्या है, तो चरण 1 चरण 4 से जाने के बाद, यह नहीं पढ़ सकते हैं फ़ाइल कह रही है कि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

त्रुटि मैं प्राप्त करते हैं:

बिना क्रिया के अपवाद: System.IO.IOException: प्रक्रिया फ़ाइल तक नहीं पहुँच सकते हैं 'c: \ test.xml' क्योंकि इसे किसी अन्य प्रक्रिया द्वारा उपयोग किया जा रहा है।

क्या गलत हो रहा है? क्या मेरे प्रोग्राम के चरण 1 के पाठक के पास अभी भी फ़ाइल खुलती है, या फ़ाइल तक पहुंचने वाली कुछ पूरी तरह से अलग प्रक्रिया है, या यह है कि फ्लैग को झूठी सेट करने के बावजूद फ़ाइलवेचर अभी भी 4 से चरण 1 पर जाने के बाद फ़ाइल देख रहा है?

+0

आप अपने कोड पोस्ट कर सकते हैं। इससे हमें आपके प्रश्न का उत्तर देने में मदद मिल सकती है। – klabranche

+1

कुछ कोड पोस्ट करें। आपकी मदद करने में हमारी सहायता करें। –

+1

यह कोड थोड़ी बड़ी और गोपनीय है क्योंकि यह एक वित्तीय फर्म के लिए है, लेकिन मैं देखूंगा कि मैं इसे सुरक्षित कर सकता हूं और इसे पोस्ट कर सकता हूं। – xbonez

उत्तर

8

यदि आपका कोड इस के समान है:

[STAThread] 
static void Main(string[] args) 
{ 
    string file = "temp.txt"; 
    ReadFile(file); 
    FileSystemWatcher fswatcher = new FileSystemWatcher(".\\"); 
    fswatcher.Changed += delegate(object sender, FileSystemEventArgs e) 
          { 
           ReadFile(e.FullPath); 
          }; 
    while (true) 
    { 
     fswatcher.WaitForChanged(WatcherChangeTypes.Changed); 
    } 
} 
private static void ReadFile(string file) 
{ 
    Stream stream = File.OpenRead(file); 
    StreamReader streamReader = new StreamReader(stream); 
    string str = streamReader.ReadToEnd(); 
    MessageBox.Show(str); 
    streamReader.Close(); 
    stream.Close(); 
} 

आप नोटपैड के माध्यम से फ़ाइल है, तो, आप जब संपादित कर रहे हैं सहेजें बटन पर क्लिक करें, यह फ़ाइल को खुला रखता है, जबकि जैसे कि आप प्रोग्राम को बंद करते हैं और इसे सहेजते हैं ऐसा नहीं करता। मुझे नहीं पता कि यह नोटपैड की एक बग या अनियंत्रित विशेषता है, लेकिन यह आपकी समस्या हो सकती है।इसे ठीक करने का एक तरीका निम्न कार्य करना है:

अपने अज्ञात प्रतिनिधि में, या जहां भी आप ReadFile() पर कॉल निष्पादित करते हैं, Thread.Sleep(1000) पर कॉल करें, प्रोग्राम को फ़ाइल पढ़ने से पहले प्रतीक्षा करें और आपका कोड ठीक काम करना चाहिए।

+1

थ्रेड का उपयोग करें। नींद ने समस्या हल कर दी है। धन्यवाद! – xbonez

+0

@xbonez: यह कोड मेरे लिए ठीक काम करता है, यहां तक ​​कि 'थ्रेड। स्लीप() 'के बिना भी। (मैंने 'Messagebox.Show' को 'कंसोल। राइटलाइन' में बदल दिया है) हालांकि, मैं अभी भी 'उपयोग' कथन का उपयोग करूंगा। – JohnB

+0

कुछ और के आसपास खेलने के बाद, मुझे पता चला कि अगर मेरे पास इस प्रोग्राम के दो उदाहरण हैं, तो एक ही फाइल को देखते हुए, जब मैं नोटपैड में "सेव" पर क्लिक करता हूं, तो मुझे यह त्रुटि किसी एक उदाहरण से मिलती है (दूसरा चल रहा है): 'प्रक्रिया फ़ाइल' c: \ file.txt 'तक नहीं पहुंच सकती है क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है। – JohnB

4

आप जो प्रक्रिया

फ़ाइल सबसे अधिक संभावना से खुला आयोजित किया जाता है जो कुछ भी पहली जगह में आग परिवर्तन सूचना के कारण होता है के लिए खुला हैन्डल होता है देखने के लिए http://www.sysinternals.com से प्रोसेस एक्सप्लोरर जैसे किसी उपकरण का उपयोग कर सकते हैं।

+0

+1 देखता हूं। – NotMe

0

ऐसी कई चीजें हैं जो चल रही हैं।

सबसे पहले, सुनिश्चित करें कि IDisposable लागू करने वाली सभी चीज़ों के आस-पास उपयोग क्लॉज का उपयोग करके आप फ़ाइल लेखक (बंद पर्याप्त पर्याप्त नहीं है) का सही ढंग से निपटान करते हैं।

दूसरा, यह आप बस पढ़ रहे हैं, सुनिश्चित करें कि फ़ाइल खोलते समय आपके पास सही झंडे सेट हैं।

आगे जाने के लिए यदि आप एक कोड ब्लॉक प्रदान करते हैं तो यह मदद मिलेगी कि यह दिखाया गया कि आप इसे कैसे पूरा कर रहे थे; विशेष रूप से फ़ाइल के पढ़ने के आसपास

+0

+1: मैं सहमत हूं, 'उपयोग' कथन – JohnB

3

नोट: भले ही नोटपैड में "file.txt" खुला है, यह कोड अभी भी काम करता है, क्योंकि यह पढ़ने के लिए खोल रहा है।

using System; 
using System.IO; 

class Program 
{ 
    static void Main(string[] args) 
    { 
    ReadFromFile(@"C:\file.txt"); 
    Console.ReadLine(); 
    } 

    static void ReadFromFile(string filename) 
    { 
    string line; 
    using (StreamReader sr = File.OpenText(filename)) 
    { 
     line = sr.ReadLine(); 
     while (line != null) 
     { 
     Console.WriteLine(str); 
     line = sr.ReadLine(); 
     } 
     sr.Close(); 
    } 
    } 
} 

या बस:

string text = System.IO.File.ReadAllText(@"C:\file.txt");

3

अन्य उत्तरों के अलावा यह संभव है कि FileWatcher उस फ़ाइल को प्रतिक्रिया देता है जो अभी तक उस ऐप द्वारा बंद नहीं हुआ है। चरण 1 में तुरंत विफल होने की कोशिश न करें, लेकिन छोटी देरी के साथ कई प्रयासों को आजमाएं।

0

खोले गए फाइलों की सूची प्राप्त करने के लिए आप इस एमएस उपयोगिता openfiles का उपयोग कर सकते हैं और समझ सकते हैं कि फ़ाइल किसने खोली है।

openfiles /query 

इसके अलावा यह नेटवर्क उपयोगकर्ताओं द्वारा खोले गए फ़ाइलों को डिस्कनेक्ट करने की अनुमति देता है।

openfiles /disconnect /id XXXX 

आप स्थानीय पीसी के लिए इसका इस्तेमाल करते हैं आप वस्तुओं की सूची बनाए रखें वैश्विक ध्वज स्थापित करना चाहिए चाहते हैं:

openfiles /local on 

link का पालन करें अधिक जानकारी प्राप्त करने के लिए।

0

समस्या यह है कि फाइल सिस्टम सिस्टम जब फ़ाइल बनाया गया था तुरंत आपको बताता है। यह फ़ाइल को रिलीज़ होने की प्रतीक्षा नहीं करता है। उदाहरण के लिए, जब आप एक बड़ी फ़ाइल की प्रतिलिपि बनाते हैं जिसमें कॉपी करने के लिए 3 सेकंड लगते हैं, तो आपको उसके बाद फ़ाइल खोलनी होगी।

http://www.codeproject.com/Questions/461666/FileSystemWatcher-issue-in-windows-application Wait until file is unlocked in .NET

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