2012-03-27 13 views
5

के साथ मुझे विजुअल बेसिक 6 द्वारा उत्पादित विरासत डेटाबेस फ़ाइल से डेटा पढ़ने की आवश्यकता है। विरासत सॉफ्टवेयर से मैंने पाया कि फ़ाइल पुट और पुट फ़ंक्शन के पैरामीटर के रूप में रिकॉर्ड की तरह गुजरना।पढ़ना (फाइल सिस्टम.फाइलगेट के साथ) वीबी 6 रिकॉर्ड फ़ाइल (पुट के साथ लिखित) सी #

Type THE_TYPE 
    FIELD_1 As Single 
    FIELD_2 As String * 20 
    FIELD_3(1 To 50) As Single 
    FIELD_4(1 To 10) As String * 1 
End Type 

मेरे प्रकार बड़े और अधिक जटिल हैं, लेकिन मैं THE_TYPE में अपने प्रोजेक्ट में मैं अलग अलग परिभाषा डाल दिया है: इन संरचनाओं इस प्रकार के रूप में परिभाषित कर रहे हैं। मैंने पाया है कि माइक्रोसॉफ्ट आयात करना। विज़ुअलबासिक मुझे फ़ाइल लिखने के लिए उपयोग किए जाने वाले वीबी कार्यों तक पहुंच प्रदान करता है, इसलिए मैं फ़ाइल को सिस्टम खोल रहा हूं और फाइल सिस्टम को खोल रहा हूं। ओपनफाइल() और .CloseFile(); अब मैं अंत में निहित डेटा पढ़ने की जरूरत है और मूल कार्य के बाद से किया गया था:

Public RecordContent As THE_TYPE 
[...] 
Get #1, recordNumber, RecordContent 

मैं मैं() Microsoft.VisualBasic.FileSystem.FileGet की तरह कुछ इसी तरह, उपयोग कर सकते हैं लगता है। तो सवाल यह है कि, मैं एक कंटेनर को कैसे परिभाषित कर सकता हूं, मुझे लगता है कि मूल VB6 प्रकार "THE_TYPE" के समान एक वर्ग है? मैं इस वस्तु को सही ढंग से भरने के लिए .FileGet() को कैसे कॉल करूं?

+0

जबकि जीएसआरआर ने आपको सही दिशा में इंगित किया हो सकता है, जानते हैं कि 'पुट' 'रैंडम' और 'बाइनरी' के 'ओपन' मोड के बीच 'पुट' के तरीके में बड़े अंतर हैं। Http://msdn.microsoft.com/en-us/library/aa266212(v=VS.60).aspx और http://msdn.microsoft.com/en-us/library/aa266177(v=vs देखें। 60) विवरण के लिए .aspx। मैं इसे ऊपर लाता हूं क्योंकि यदि 'स्ट्रिंग' और सरणी सदस्य निश्चित आकार के हैं, तो मुझे आश्चर्य हुआ कि वीबी 6 ऐप ने 'ओपन ... बाइनरी' मोड का उपयोग किया था। – rskar

+0

यह रैंडम मोड – ccalboni

+1

+1 में था 'माइक्रोसॉफ्ट.विज़ुअल बेसिक' आयात करने और 'फाइल सिस्टम' का उपयोग करने के लिए। आप आश्चर्यचकित होंगे [कैसे] (http://stackoverflow.com/questions/7290976/vb6-how-are-binary-files-encoded-using-put-statement) [अक्सर] (http://stackoverflow.com/प्रश्न/88860 9 6/कनवर्टिंग-क्विक-बेसिक-टू-वीबी-नेट-यादृच्छिक-एक्सेस-फाइल) लोग उनको अनदेखा करते हैं! – MarkJ

उत्तर

6

कुंजी VB.NET में संरचना घोषणा पर उचित रूप से विशेषताओं को परिभाषित कर रही है। बशर्ते संरचना हमेशा FileGet द्वारा शुरू की जाएगी, आपको किसी भी निर्माता में अपने निश्चित फ़ील्ड मैन्युअल रूप से प्रारंभ करने की आवश्यकता नहीं है, अन्यथा, आप करते हैं।

Structure THE_TYPE 
    Public FIELD_1 As Single 
    <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> Public FIELD_2 As String 
    <VBFixedArray(49)> Public FIELD_3 As Single() 
    <VBFixedArray(9)> Public FIELD_4 As Char() 
End Structure 

Obviosuly, सरणी शून्य से शुरू होनी चाहिए, इसलिए ऊपरी सीमाएं नीचे स्थानांतरित हो गई हैं। फ़ाइल से

पढ़ना:

Dim d As System.ValueType = New THE_TYPE() 

FileOpen(1, "...", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 234) 
FileGet(1, d, 1) 
FileClose(1) 

234 VB6 में संरचना का आकार है। यह वीबी.नेट में बड़ा है, इसलिए आप इसे हार्डकोड करना चाहते हैं।

+0

वही है जो मैं ढूंढ रहा था, धन्यवाद! – ccalboni

+0

+1। मैंने इसका परीक्षण नहीं किया है, और हार्डकोडिंग 234 सुरक्षित हो सकता है, लेकिन 'मार्शल। सिज़ोफ' सही संरचना आकार लौटाएगा? – MarkJ

+0

@MarkJ नहीं, इस मामले में यह 'लेन' के समान होता है, जो 244 है। ऐसा शायद इसलिए है क्योंकि 'Char' .net में दो बाइट्स है। – GSerg