2011-01-23 12 views
14

मैंने इंद्रधनुष तालिका बनाने के लिए डेल्फी में एक उपकरण बनाया। फ़ाइल ठीक होने तक यह ठीक था जब तक कि 3.1 जीबी तक नहीं बढ़ी। मैंने अपना कार्यक्रम बंद कर दिया। तो मैं इसे फिर से खोला और इस कोड को निष्पादित करते समय यह दुर्घटनाओं:डेल्फी पास्कल - 2 जीबी से बड़ी फ़ाइल में डेटा कैसे लिखना है?

Assign(RainbowFile,'Rainbow_table.txt'); {assign a text file} 
Append(RainbowFile); 

डेल्फी संदेश के साथ 'I/O त्रुटि 131' त्रुटि "उठाया expection वर्ग EInOutError से पता चलता मेरा प्रश्न:। मौजूदा फ़ाइल बड़ा करने के लिए डेटा संलग्न करने का तरीका 2 GB से // अप्रचलित अगला सवाल:। मैं वर्तमान कोड है:।।

Content_to_file := (#13+#10+Start_string+':'+hexstr(GTA_San_Andreas_CRC32(Start_string), 8)); 
    RainbowFile_handle.WriteBuffer(Content_to_file[1], Length(Content_to_file)*SizeOf(Char)); 

Content_to_file चर से छुटकारा पाने के लिए मैं इसे सीधे WriteBuffer डाला अगर यह `संभव चाहते

012,

संपादित करें:

TFileStream 2 जीबी से बड़ी फ़ाइलों के साथ काम करता है। मैंने अभी इसका परीक्षण किया।

RainbowFile_handle.WriteBuffer(Start_string[1]+':', 

मुझे कोई चर तर्क पारित करने के लिए मतलब है: हालांकि यह संभव तो लिखने के लिए है। या क्या मैं निश्चित रूप से चर के पहले चार पास कर चुके हैं?

संपादित करें 2:

मैं वर्तमान में यह इस तरह से बना दिया है:

Content_to_file := (#13+#10+Start_string+':'+hexstr(GTA_San_Andreas_CRC32(Start_string), 8)); 
    RainbowFile_handle.WriteBuffer(Content_to_file[1], Length(Content_to_file)*SizeOf(Char)); 

यह इस चर के बिना यह करने के लिए संभव है?

+2

क्या आपकी फाइल सिस्टम फाइलों का समर्थन करता है> 2 जीबी? – Satya

+0

हां, यह करता है। मेरे पास विंडोज एक्सपी 32-बिट है। वर्तमान में फ़ाइल मेरे एनटीएफएस विभाजन पर 3.1 जीबी है। समस्या मेरे पास्कल कोड के साथ है। – fastman92

उत्तर

8

सादा प्रक्रिया I/O आधुनिक परिचालनों के लिए उपयुक्त नहीं है। बस TFileStream कक्षा का उपयोग करें, या, यदि आपको ठीक नियंत्रण की आवश्यकता है, तो सीधे विंडोज एपीआई का उपयोग करें (CreateFile और WriteFile फ़ंक्शंस के बारे में पढ़ें)।

+2

"सादा प्रक्रिया I/O आधुनिक परिचालनों के लिए उपयुक्त नहीं है।" आप इन तथाकथित "आधुनिक परिचालन" क्या हैं जिनके बारे में आप बात कर रहे हैं? – dummzeuch

+3

@ डमज़ेच लेखन 2 जीबी से परे लेखन एक बिल्कुल मान्य * आधुनिक * ऑपरेशन है, और इसलिए पढ़ रहा है। –

+0

अनुवाद: यह एक बग है, और एम्बरकेडरो परवाह नहीं लगती है। –

24

आपको स्ट्रीम पर स्विच करना चाहिए। TFileStream समस्याओं के बिना इसे संभाल लेंगे। ध्यान दें कि यदि आप यादृच्छिक पहुंच का उपयोग करते हैं तो आपको यह सुनिश्चित करना होगा कि आप Seek और Position के 64 बिट संस्करणों का उपयोग करें।

के बाद आप फ़ाइल धारा आप समाप्त करने के लिए प्राप्त कर सकते हैं खोला है: उम्मीद है कि

procedure StreamWriteLine(Stream: TFileStream; Text: string); 
begin 
    Text := Text + sLineBreak; 
    Stream.WriteBuffer(Text[1], Length(Text)*SizeOf(Char)); 
end; 

, कि यदि आपके पास पर्याप्त सुराग को भरने के लिए देना चाहिए:

Stream.Seek(0, soEnd); 

तो फिर तुम लाइनों के रूप में तो लिख सकते हैं शेष विवरण में।

+0

अगला स्पष्ट प्रश्न यह है कि एक स्ट्रीम में बहु-तर्क लिखने() को कैसे करें। मुझे आवश्यकता होने पर मुझे केवल धाराओं की आवश्यकता है। –

+0

@ मार्को इस तरह के दिनचर्या के साथ आने और इसे मौजूदा धारा वर्ग के चारों ओर लपेटने में ज्यादा परेशानी नहीं होगी। मैं व्यक्तिगत रूप से डेल्फी के साथ प्रदान की जाने वाली स्ट्रीम कक्षाओं का उपयोग नहीं करता हूं, बल्कि इसके अपने उप-वर्गीकृत संस्करणों को पसंद करता हूं जो मेरी आवश्यकताओं को पूरा करने के लिए अतिरिक्त कार्यक्षमता जोड़ते हैं। विशेष रूप से मेरे पास एक फ़ाइल स्ट्रीम है जो प्रदर्शन कारणों के लिए I/O बफर करती है और एक मेमोरी स्ट्रीम जो आवंटित स्मृति की मांग के बजाय आवंटित करती है। –

+0

तो मैं वास्तव में इसे देखना चाहूंगा। लिखें (एलएन) कंपाइलर जादू का उपयोग करता है। टेक्स्टरेक सिस्टम से गड़बड़ कर कुछ तरीके हैं, लेकिन यदि आप ऐसा करते हैं तो आप 64-बिट मुद्दों को सीधे ठीक कर सकते हैं। धाराएं आईएमएचओ हैं जो टेक्स्टफाइल के लिए बहुत सहज नहीं हैं। –

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