2009-04-26 9 views
6

मैं डेल्फी 7 ऐप में पढ़ने के लिए एक टेक्स्ट फ़ाइल खोलने की कोशिश कर रहा हूं, लेकिन मुझे आई/ओ त्रुटि 32 (उल्लंघन साझा करना) मिल रहा है क्योंकि किसी अन्य एप्लिकेशन में पहले से ही फ़ाइल खुलती है। मैंने फ़ाइलमोड को "fmOpenRead या fmShareDenyNone" पर सेट करने का प्रयास किया है, लेकिन अब यह एहसास है कि यह टेक्स्ट फ़ाइलों पर लागू नहीं होता है।डेल्फी - उल्लंघन उद्घाटन टेक्स्ट फ़ाइल साझा करना

क्या पाठ फ़ाइलों को पढ़ने का कोई तरीका है जो किसी अन्य एप्लिकेशन द्वारा खुले हैं?

var 
    f: TextFile; 
begin 
    FileMode := fmOpenRead or fmShareDenyNone; // FileMode IS NOT APPLICABLE TO TEXT FILES!! 
    AssignFile(f, FileName); 
    Reset(f); 
+0

आप टेक्स्ट फ़ाइलों पर इतने उत्सुक क्यों हैं? स्ट्रीम क्लास का उपयोग क्यों न करें जो उचित फ़ाइल एक्सेस और मोड साझा करने की अनुमति देता है? – mghie

+0

क्योंकि मैं एक समय में एक पंक्ति को पढ़ना चाहता हूं, और TFileStream के पास इसके लिए विधियां नहीं हैं। मुझे लगता है कि मैं एक बफर को पढ़ सकता हूं और सीआर/एलएफ पर विभाजित हो सकता हूं। – Simes

+1

आप 'TFreamStream' से लाइनों को पढ़ने के लिए 'TStreamReader' का उपयोग कर सकते हैं। इसमें 'रीडलाइन()' विधि है, और आपके लिए आंतरिक रूप से बफरिंग करता है। –

उत्तर

1

यह आपकी समस्या को तत्काल हल करेगा। एक TStringList का उपयोग कर फ़ाइल लोड करें। बस फोन:

... 
var sl: TStringList; 
begin 
    sl := TStringList.create(); 
    try 
    sl.loadFromFile(Filename); 
    ...do your stuff here... 
    finally 
    freeAndNil(sl); 
    end; 
end; 

मैंने पाया कि पाठ फ़ाइलों के साथ काम कर, यह TStringList उपयोग करने के लिए सबसे अच्छा है। अन्यथा मैं TFileStream के लिए जाना होगा और वहां आप अपना खोलने का तरीका निर्दिष्ट कर सकते हैं।

+0

सहायक नहीं है? Simes, क्या आपने यह कोशिश की है? –

+0

लोडफ्रॉमफ़ाइल() कम से कम डेल्फी 5 और 2007 में करता है) "मोड के लिए fmOpenRead या fmShareDenyWrite"। यह निश्चित रूप से नहीं है कि ओपी क्या चाहता है। – mghie

+0

??? हालांकि, सिम्स चाहता है कि यह वही है। वह सिर्फ फाइलों को पढ़ने के बिना अन्य प्रक्रियाओं की देखभाल किए बिना पढ़ना चाहता है। वह बिल्कुल उसका सवाल था। –

3

यह इस बात पर निर्भर करता है कि दूसरी प्रक्रिया ने फ़ाइल कैसे खोला ... अगर उसने फ़ाइल खोला तो विशेष रूप से आप सफल होने वाले नहीं हैं।

और टेक्स्टफाइल पुरानी टोपी है, मुझे लगता है कि यह ओल्ड स्टाइल डॉस के साथ संगत होने के लिए विशेष मोड में खुल जाएगा। आपको TFileStream या इसी तरह का उपयोग करना चाहिए।

TStringList अन्य प्रक्रियाओं के आधार पर फिर से काम कर सकता है। लेकिन अगर फ़ाइल लिखी जा रही है (एक .log फ़ाइल की तरह) fmShareDenyWrite काम नहीं करेगा।

+0

मुझे नहीं पता कि कैसे दूसरी प्रक्रिया फाइल खोल रही है, लेकिन नोटपैड इसे सफलतापूर्वक खोल सकता है जबकि इसे लिखा जा रहा है। – Simes

+0

ऐसा लगता है कि आप भाग्य में हैं। बस TextFile खाओ। –

+0

@ साइम्स, मैं एक प्रक्रिया को रेखांकित करता हूं जो आपको दिखाता है कि फाइलें कैसे खोली जा रही हैं, यहां: http://stackoverflow.com/questions/737053/log-file-monitor/739328#739328 –

1

यदि मुझे सही याद है, तो टेक्स्टफाइलमोड वैरिएबल भी है जो केवल टेक्स्ट फ़ाइलों पर लागू होता है।

+0

यह सही होगा, लेकिन यह संकलित नहीं है और इसे सहायता में नहीं ढूंढ सकता है। – Simes

1
हो सकता है कि इस तरह

:

vFileList := TStringList.Create; 
    try 
    vFileStream := TFileStream.Create('myfile.txt', fmOpenRead or fmShareDenyNone); 
    try 
     vFileList.LoadFromStream(vFileStream); 
    finally 
     vFileStream.Free; 
    end; 
    // Use vFileList 
    finally 
    vFileList.Free; 
    end; 
12

बल्कि LoadFromFile से, TStringList के LoadFromStream विधि का उपयोग करें। आपको लगता है कि जिस तरह से ताला लगा नियंत्रित करने के लिए मिलता है:

var 
    slFile: TStrings; 
    stream: TStream; 
begin 
    slFile := TStringList.Create; 
    try 
     stream := TFileStream.Create(filename, fmOpenRead or fmShareDenyNone); 
     try 
     slFile.LoadFromStream(stream); 
     finally 
     stream.Free; 
     end; 

     //Use the stringlist 
    finally 
     slFile.Free; 
    end; 
end; 

उदाहरण एक TStringList में लोड करने धारा उपयोग कर रहा है यही कारण है कि। यदि आप केवल टुकड़े पढ़ना चाहते हैं, तो आप ऐसा कर सकते हैं। बस स्ट्रीम से पढ़ें।

+0

यह समस्या को हल करता है और हल करता है। केवल चिंता स्मृति उपयोग के बारे में है: पूरी फ़ाइल स्मृति में लोड हो जाती है। यह एक मुद्दा हो सकता है। – Ghigo

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