2010-09-07 25 views
8

में डेटा सहेजें मेरे पास एक पोर्टेबल निष्पादन योग्य है जो निष्पादन योग्य के समान फ़ोल्डर में फ़ाइल को डेटा सहेजता है। क्या कोई तरीका है कि जब मैं ऐप बंद करता हूं तो मैं डेटा को एक्जिक्यूटिव में ही सहेज सकता हूं?निष्पादन योग्य

यह शायद अजीब है, लेकिन मेरे साथ डेटा ले रहा है और केवल exe के लिए एक फ़ाइल है और डेटा बहुत अच्छा होगा।

अगर यह सी # के साथ बनाया गया था, तो यह पसंद करेंगे, लेकिन यह आवश्यक नहीं है।

उत्तर

3

आप अपने स्वयं के EXE को किसी सुरुचिपूर्ण या कॉम्पैक्ट तरीके से संग्रहीत डेटा रखने के लिए संशोधित नहीं कर सकते हैं। सबसे पहले, ओएसईईईई फाइल पर लॉक प्राप्त करता है जबकि आवेदन के भीतर निहित किया जा रहा है। दूसरा, एक EXE पूर्व-संकलित (कम से कम एमएसआईएल में) आता है, और फ़ाइल के स्रोत डेटा में संशोधन के लिए आमतौर पर कोड हैंडल पर विभिन्न पॉइंटर्स को रीसेट करने के लिए पुनर्मूल्यांकन की आवश्यकता होती है, या फिर आप जो भी कर रहे हैं उसके बारे में एक बहुत ही गूढ़ स्तर पर एक गंभीर ज्ञान फ़ाइल।

आम तौर पर स्वीकृत विधियां एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल, एक संसाधन फ़ाइल, या कुछ कस्टम फ़ाइल जो आप रनटाइम पर बना/पढ़/संशोधित करते हैं, जैसे कि आप अभी कर रहे हैं। किसी आवेदन के लिए दो फाइलें चिंता के कारण नहीं होनी चाहिए

+0

हाँ, मुझे पता है कि यह बुरा नहीं है, लेकिन मैक के साथ आप निष्पादन योग्य की प्रतिलिपि बना सकते हैं, यह भी एक फ़ोल्डर है, और आपकी सारी जानकारी आपके साथ जाती है। यह सिर्फ एक मामूली जानकारी लगता है लेकिन इसे काम पर रखना चाहता है। –

1

तो अभी आप एक app.config (और सेटिंग्स.सेटिंग) फ़ाइल का उपयोग कर रहे हैं? मेरा मानना ​​है कि यह .exe के करीब डेटा को सहेजने का सबसे कॉम्पैक्ट तरीका है।

मुझे संदेह होगा कि आप .exe, या इसके किसी भी अन्य भाग के मैनिफेस्ट को बदल सकते हैं।

संपादित करें: जाहिर है, कुछ मायनों सब के बाद हो सकता है: http://www.codeproject.com/KB/msil/reflexil.aspx

2

आप कर सकते हैं, एक स्ट्रिंग संसाधन और यह पैड बाहर का उपयोग करने के साधनों के माध्यम से अंतरिक्ष आरक्षित करके। डेटा को डंप करने के लिए आप जिस निष्पादन योग्य अधिकारी को ऑफ़सेट करना चाहते हैं, उसे जानने के लिए आपको थोड़ा सा जासूसी कार्य करने की आवश्यकता है, लेकिन सावधान रहें, फ़ाइल उपयोग "में होगी, इसलिए सावधानी से आगे बढ़ें।

+0

देखें इस अन्य पोस्टिंग मैं aeons पहले बनाया ... http://stackoverflow.com/questions/1780260/write-a-value-into -pe-file/1780360 # 1780360 – t0mm13b

1

एकाधिक धाराओं का उपयोग करने का एक तरीका है, लेकिन केवल एनटीएफएस फाइल सिस्टम में काम करता है। एनटीएफएस आपको एक फ़ाइल में वैकल्पिक "नामित" धाराओं को परिभाषित करने की अनुमति देता है। सामान्य सामग्री मुख्य = अज्ञात स्ट्रीम में है। जब आप फ़ाइल पर राइट क्लिक करते हैं और गुणों की जांच करते हैं तो अतिरिक्त जानकारी के साथ इसका कुछ संबंध होता है।
दुर्भाग्यवश सी # में कई धाराओं के लिए कोई समर्थन नहीं है, लेकिन खुले स्रोत वाले तत्व हैं जो आपकी मदद कर सकते हैं।

पढ़ सकते हैं और सी # में एक एकल फाइल

1

वैकल्पिक डाटा स्ट्रीम काम कर सकते हैं करने के लिए कई धाराओं में लिखने के लिए एक अच्छा आवरण के लिए this link देखें। :: स्ट्रीम सिंटैक्स का उपयोग करके आप अपने exe के भीतर एक डेटा स्ट्रीम बना सकते हैं और डेटा पढ़/लिख सकते हैं। संपादित करें: वैकल्पिक डेटा स्ट्रीम बनाने/एक्सेस करने के लिए, आप एक अलग फ़ाइल नाम का उपयोग करेंगे। कुछ ऐसा: applicAtion.exe: सेटिंग्स: $ डेटा यह application.exe के भीतर "सेटिंग्स" नामक डेटा स्ट्रीम तक पहुंच जाएगा। ऐसा करने के लिए आपको फ़ाइल को पढ़ने या लिखते समय फ़ाइल नाम पर $: डेटा जोड़ना होगा। यह कार्यक्षमता ntfs द्वारा प्रदान की जाती है, इसलिए यह सी # में काम को ढकती है और एप्लिकेशन चलने पर काम करना चाहिए। http://msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx

+0

पैडेंटिक होने के लिए खेद है - लेकिन आपने सिंटैक्स का उपयोग किया जो सी ++ जैसा दिखता है? – t0mm13b

+0

मैंने वैकल्पिक डेटा स्ट्रीम का बेहतर विवरण जोड़ा। यह एक फाइल सिस्टम सुविधा है और भाषा विशिष्ट नहीं है। – Mike

0

आप अपने साथ डेटा लेने के लिए और केवल exe और डेटा के लिए एक फ़ाइल है चाहते हैं, उन्हें एक आत्म निकालने .exe में .zip:

अतिरिक्त जानकारी पर उपलब्ध है।

0

आप निष्पादन योग्य फ़ाइल के अंत में डेटा जोड़ सकते हैं:

var executableName = Process.GetCurrentProcess().MainModule.FileName; 

    // rename executable file 
    var newExecutableName = fullPath.Replace(".exe", "_.exe"); 
    FileInfo fi = new FileInfo(executableName); 
    fi.MoveTo(newExecutableName); 

    // make copy of executable file to original name 
    File.Copy(newExecutableName, executableName); 

    // write data end of new file 
    var bytes = Encoding.ASCII.GetBytes("new data..."); 

    using (FileStream file = File.OpenWrite(executableName)) 
     { 
      file.Seek(0, SeekOrigin.End); 
      file.Write(bytes, 0, bytes.Length); 
     } 

    // we can delete old file when exited 
संबंधित मुद्दे