2010-08-15 12 views
5

डेल्फी 7 से डेल्फी 2010 तक कुछ कोड पोर्ट करते समय मैं अपने लोडटेक्स्टफ्रोफाइल() फ़ंक्शन को फिर से लिख रहा था।क्या डेल्फी 2010 में LoadTextFromFile फ़ंक्शन है?

function LoadTextFromFile(const aFullFileName: string): string; 
var 
    lBuffer:  TBytes; 
    lEncoding: TEncoding; 
    lFileStream: TFileStream; 
    lSize:  Integer; 

begin 

    if not FileExists(aFullFileName) then 
    begin 
    raise Exception.Create('File "' + aFullFileName + '" not found.'); 
    end; 

    lFileStream := TFileStream.Create(aFullFileName, fmOpenRead + fmShareDenyNone); 
    try 

    if lFileStream.Size <= 0 then 
    begin 
     Result := ''; 
    end 
    else 
    begin 

     lSize := lFileStream.Size - lFileStream.Position; 

     SetLength(lBuffer, lSize); 

     // Read file into TBytes buffer 
     lFileStream.Read(lBuffer[0], lSize); 

     // Read encoding from buffer 
     TEncoding.GetBufferEncoding(lBuffer, lEncoding); 

     // Get string from buffer 
     Result := lEncoding.GetString(lBuffer); 

    end; 

    finally 
    lFileStream.Free; 
    end; 

end; 

जब कोई विचार मेरे सिर पर टक्कर मार रहा था: मानक पुस्तकालय में ऐसा कुछ होना चाहिए। कई उपयोगकर्ता एक स्ट्रिंग में एक टेक्स्ट फ़ाइल पढ़ना चाहते हैं, लेकिन मुझे ऐसा मानक फ़ंक्शन नहीं मिला। मैं सबसे नज़दीक आया था पाठ लोड करने के लिए TStringlist का उपयोग कर रहा था। लेकिन ए) एक टीस्ट्रिंगलिस्ट बनाना अनावश्यक दिखता है और बी) मैं टीस्ट्रिंगलिस्ट से ओवरहेड पीड़ित नहीं करना चाहता हूं।

प्रश्न: क्या डेल्फी 2010 में मानक लोडटेक्स्टफ्रोफाइल फ़ंक्शन है?

+0

यहां तक ​​कि डेल्फी 7 में, आप नहीं था कि सभी करते हैं। 'TFileStream' के बजाय' TStringStream' का उपयोग करें, और मार्को के उत्तर का उपयोग करें। साथ ही, मैं उत्सुक हूं: आपने कभी भी पाया है कि 'स्थिति' संपत्ति स्ट्रीम बनाने के तुरंत बाद शून्य नहीं थी, जैसे कि 'lSize' की गणना करने के लिए आपको इसे' आकार 'से घटा देना होगा? –

+0

हाय रॉब, डेल्फी 7 में मुझे यूटीएफ 8 फाइलों को लोड/सहेजने में सक्षम होना था। और सबसे महत्वपूर्ण बात यह है कि मुझे टीस्ट्रिंगस्ट्रीम के बारे में पता नहीं था। स्थिति को वहां होने की आवश्यकता नहीं है। ऐसा इसलिए है क्योंकि मैंने TStrings.Loadfromstream विधि से कुछ कोड कॉपी किया है जिसमें इसकी स्थिति है। मेरे कोड में एक और बग भी है क्योंकि यह बीओएम के साथ फाइलों को संभाल नहीं करता है। तो कोई भी मेरे उदाहरण का उपयोग करने के बारे में सोच रहा है: नहीं। इसके बजाय TFile.ReadAllText का उपयोग करें। –

उत्तर

14

हां डेल्फी 2010 में इस तरह के एक समारोह मौजूद है, जिसे ReadAllText कहा जाता है और IOUtils इकाई में घोषित TFile रिकॉर्ड का हिस्सा है।

चेक इस घोषणा

class function ReadAllText(const Path: string): string; overload; inline; static; 
class function ReadAllText(const Path: string; const Encoding: TEncoding): string; overload; inline; static; 

इस नमूना देखने

program Project80; 

{$APPTYPE CONSOLE} 

uses 
    IOUtils, 
    SysUtils; 
Var 
Content : string; 
begin 
    try 
    Content:=TFile.ReadAllText('C:\Downloads\test.css'); //load the text of the file in a single line of code 
    //Content:=TFile.ReadAllText('C:\Downloads\test.css',TEncoding.UTF8); //you can an encoding too. 
    Writeln(Content); 
    Readln; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
+0

धन्यवाद, बस मैं जो देख रहा था। जिज्ञासा से बाहर: जब IOUtils और TFile डेल्फी में जोड़ा गया? –

+1

@ जेन डेर्क: डेल्फी 2010. –

+2

मैंने नोटिस किया कि TFile.ReadAllText फ़ाइल को पढ़ने पर फ़ाइल पर एक विशेष लॉक रखता है। मैं एक fmShareDenyWrite ताला पसंद किया होगा। –

4

TStringStream.LoadFromStream/फ़ाइल? वैसे भी बहुत बड़े तार हमेशा थोड़ा अपमानजनक होते हैं। आपको गलती से इसकी प्रतिलिपि बनाने के लिए बहुत सावधान रहना होगा।

1

एक त्वरित तरीका TStringList.LoadFromFile है()। फिर डेटा को एक बड़ी स्ट्रिंग के रूप में एक्सेस करने के लिए TStringlist.Text का उपयोग करें। कोशिश करने/मुक्त करने के लिए मत भूलना, आदर्श रूप से कोशिश करें .. अंतिम रूप से ब्लॉक करें।

+2

इस विधि को फ़ाइल के आकार की कई बार आवश्यकता होती है, और मैं इसे बड़ी फ़ाइलों के लिए अनुशंसा नहीं करता। –

2

मैंने एक ही समाधान की कोशिश की, लेकिन इसे lEncoding एक क्लास वैरिएबल बना दिया ताकि इसे लगातार बनाया जा सके, इसलिए मैं अपनी फ़ाइल को उसी एन्कोडिंग में सहेजूंगा जैसा मैंने इसे पढ़ा था। हालांकि, GetBufferEncoding पर कॉल कुछ भी नहीं करता है अगर lEncoding पहले से ही कुछ पर सेट है (जैसा कि पिछली फ़ाइल पढ़ी गई थी)। तो, सबसे पहले मैंने इसे मुक्त करने की कोशिश की और इसने पूरे स्थान पर पहुंच उल्लंघन का कारण बना दिया। अब मैं इसे दूसरी कॉल करने से पहले इसे शून्य करने के लिए सेट करता हूं और ऐसा लगता है कि यह काम करता है।

कुछ इस तरह:

if Assigned(lEncoding) then begin 
    lEncoding := nil; 
end; 
GetBufferedEncoding(buffer, lEncoding); 
संबंधित मुद्दे