2011-05-23 14 views
8

में स्ट्रिंग में फ़ाइल की सामग्री को कैसे पढ़ा जाता है, मैं अपने आवेदन को डेल्फी 2007 से डेल्फी xe में माइग्रेट कर रहा हूं, लेकिन मुझे एक ऐसी प्रक्रिया में समस्या है जो फ़ाइल (एएससीआई) पढ़ती है और सामग्री को स्ट्रिंगडेल्फी XE

में संग्रहीत करती है इस

कोड डेल्फी 2007

function LoadFileToStr(const FileName: TFileName): String; 
var 
    FileStream : TFileStream; 
begin 
    FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
    try 
    if FileStream.Size>0 then 
    begin 
     SetLength(Result, FileStream.Size); 
     FileStream.Read(Pointer(Result)^, FileStream.Size); 
    end; 
    finally 
    FileStream.Free; 
    end; 
end; 

में ठीक काम करते हैं लेकिन जब डेल्फी XE में परिणाम के लिए इस कोड को निष्पादित जैसे '????????' प्रतीकों जो डेल्फी XE, मुझे पता कर रहे हैं यूनिकोड है इसलिए मैं इन पंक्तियों को बदलता हूं

 SetLength(Result, FileStream.Size); 
     FileStream.Read(Pointer(Result)^, FileStream.Size); 

 SetLength(Result, FileStream.Size*2); 
     FileStream.Read(Pointer(Result)^, FileStream.Size); 

को यूनिकोड स्ट्रिंग में फ़ाइल की सामग्री स्टोर करने के लिए, लेकिन परिणाम एक ही है।

how i can fix this procedure to read the content of this file?

+2

TStringList से सावधान रहें, क्योंकि यदि 'टेक्स्ट' फ़ाइल में किसी भी तरह ASCII NUL (0x00) वर्ण होते हैं, तो पार्सर बंद हो जाता है और आप फ़ाइल में वास्तव में कम लाइनों के साथ समाप्त होते हैं। –

उत्तर

24

आप कोड काम नहीं करता क्योंकि आप बफर के रूप में एक यूनिकोड स्ट्रिंग का उपयोग फ़ाइल की सामग्री पढ़ रहे हैं, तो आप सिर्फ एन्कोडिंग अनदेखी यूनिकोड स्ट्रिंग के लिए TFileStream के आंतरिक बफर से बाइट्स आगे बढ़ रहे हैं ।

आप आसानी से अपने प्रक्रिया ठीक कर सकते हैं, बस AnsiString

function LoadFileToStr(const FileName: TFileName): AnsiString; 

लिए परिणाम प्रकार बदलने, लेकिन मैं जो आप के बजाय TFile.ReadAllText फ़ंक्शन का उपयोग करें जो कोड की एक पंक्ति में एक फ़ाइल की सामग्री पढ़ने आप की सिफारिश करेंगे एक फ़ाइल के एन्कोडिंग को भी संभालता है।

8

आप खाते में एन्कोडिंग लेना चाहिए, उदाहरण के लिए:

function LoadFileToStr(const FileName: TFileName): String; 
var 
    FileStream : TFileStream; 
    Bytes: TBytes; 

begin 
    Result:= ''; 
    FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); 
    try 
    if FileStream.Size>0 then begin 
     SetLength(Bytes, FileStream.Size); 
     FileStream.Read(Bytes[0], FileStream.Size); 
    end; 
    Result:= TEncoding.ASCII.GetString(Bytes); 
    finally 
    FileStream.Free; 
    end; 
end; 


//test 
procedure TForm2.Button1Click(Sender: TObject); 
begin 
    ShowMessage(LoadFileToStr('C:\autoexec.bat')); 
end; 
6

मैं फ़ाइल की सामग्री लोड और फिर variable.Text के परिणाम निर्धारित करने के लिए एक TStringList उपयोग करने की अनुशंसा, उदाहरण के लिए:

function LoadFileToStr(const FileName: TFileName): String; 
var LStrings: TStringList; 
begin 
    LStrings := TStringList.Create; 
    try 
     LStrings.Loadfromfile(FileName); 
     Result := LStrings.text; 
    finally 
     FreeAndNil(LStrings); 
    end; 
end; 

इस तरह आपको किसी चीज़ के बारे में चिंता करने की ज़रूरत नहीं है, यह पीछे और भविष्य में संगत IMHO होगा।

संपादित करें: यदि आपको किसी टीस्ट्रीम वंश से लोड करने की आवश्यकता है, तो LoadFromFream को LoadFromStream से प्रतिस्थापित करें।

8

आप इसे ReadAllText फ़ंक्शन का उपयोग करके कोड की एक पंक्ति के साथ प्राप्त कर सकते हैं। इस तरह:

Uses IOUtils; 

TFile.ReadAllText(FileName); 
TFile.ReadAllText(FileName, s, TEncoding.ASCII) // force encoding 

यह सही ढंग से एएनएसआई, यूनिकोड और बाइनरी फ़ाइलों का पता लगाएगा। (अब मुझे लगता है कि आरआरज़ ने पहले ही इसकी सिफारिश की है)।

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