2009-09-18 10 views
7

मेरी प्रोजेक्ट में मुझे एक यूएसबी डिवाइस में कुछ अस्थायी फ़ाइलें बनाना है, जिन्हें मैं बंद करना चाहता हूं। तो मैंनेDeleteOnClose फ़ाइल विकल्प के साथ फ़ाइलस्ट्रीम

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose); 

जैसे कोड का उपयोग किया। यह ठीक काम करता है। लेकिन समस्या यह है कि मैं एक और फाइलऑप्शन का उपयोग करना चाहता हूं, जैसे कोई बफरिंग नहीं।

private const FileOptions FILE_FLAG_NO_BUFFERING = (FileOptions)0x20000000; 

this.fcommandHandler = new FileStream(TempFileName, 
FileMode.CreateNew, FileAccess.ReadWrite, 
FileShare.ReadWrite, 512, FileOptions.DeleteOnClose & FILE_FLAG_NO_BUFFERING); 

लेकिन यह बंद होने के बाद फ़ाइल को हटा नहीं रहा है। कृपया मदद करे।

उत्तर

8

आपको उपयोग करने की आवश्यकता है | & के बजाय।

ये बाइनरी झंडे हैं, और जब आप & कहते हैं, तो आप प्रभावी ढंग से उन सभी को मुखौटा करते हैं, जिसके परिणामस्वरूप कोई विकल्प नहीं होता है।

+0

लेकिन मुझे अपवाद मिल रहा है "आईओ ऑपरेशन काम नहीं करेगा। अधिकतर संभावना है कि फाइल बहुत लंबी हो जाएगी या सिंक्रोनस आईओ ऑपरेशंस का समर्थन करने के लिए हैंडल खोला नहीं गया था।", अगर मैं डालता हूं। इसके बजाय, जब मैं इसे कॉल कर रहा हूं। कमांडर हैंडलर। बंद करें() – Anuraj

+1

@ अणुराज: इसका मतलब यह नहीं है। गलत है, इसका मतलब है कि आपके उपयोग में कुछ गलत है। लास सही है कि आपको चाहिए के बजाय &। अपवाद आपकी अगली समस्या हल करने के लिए है। –

+0

@ जेफ येट्स: धन्यवाद कुछ अन्य विकल्पों के साथ मेरी कोशिश करें। – Anuraj

2

FileOptions.DeleteOnClose का उपयोग करें। FILE_FLAG_NO_BUFFERING & उन्हें रद्द कर देता है।

FILE_FLAG_NO_BUFFERING & FileOptions.DeleteOnClose एक सूची में देता FileOptions.None

+0

कृपया पहले उत्तर की टिप्पणी देखें। – Anuraj

+0

@Anuraj: मैं यह पता लगाने की कोशिश कर रहा हूं कि File_flag_no_buffering क्या है, DeleteOnClose निश्चित रूप से कॉल नहीं किया जा रहा है क्योंकि आप एक कर रहे हैं और इसके बजाय। –

+0

@Yuriy Faktorovich - File_flag_no_buffering फ़ाइल विकल्प एक फ़ाइल विकल्प है, जो विंडोज़ द्वारा फ़ाइलों को पढ़ने और लिखने के दौरान फ़ाइल कैशिंग से बचने में मदद करता है। यह जांचें http://stackoverflow.com/questions/122362/how-to-empty-flush-windows-read-disk-cache-in-c – Anuraj

0

WriteThrough झंडा सहित कोशिश के रूप में अच्छी तरह से उपयोग करते हुए | ऑपरेटर। FILE_FLAG_NO_BUFFERING का उपयोग करने के लिए आवश्यकताओं पर यह KB देखें। यह दिलचस्प है कि एमएस ने इस ध्वज को enum में शामिल नहीं किया है। क्या कोई कारण है कि WriteThrough इस परिदृश्य में आपको क्या चाहिए? आप सुरक्षित डेटा लिखने की कोशिश कर रहे हैं?

+0

@ एंथनी WJones: मैंने कोशिश की लेकिन फिर भी मुझे यह त्रुटि मिल रही है। मैं प्राप्त करने की कोशिश कर रहा हूं जैसे: मुझे एक फ़ाइल (उदा। Cmd.bin) डिवाइस के माध्यम से यूएसबी को कुछ आदेश जारी करना होगा, और यह फ़ाइल (उदा। Res.bin) में कुछ प्रतिक्रियाएं वापस कर देगा। लेकिन अगर मैं सामान्य सी # स्ट्रीम का उपयोग करता हूं तो विंडोज प्रतिक्रिया को कैश करेगा और हमेशा मुझे एक ही प्रतिक्रिया मिल जाएगी, इसलिए मुझे नो बफरिंग फ्लैग का उपयोग करना होगा। और फ़ाइलें अस्थायी हैं इसलिए मुझे उपयोग के बाद इसे हटाना होगा; यही कारण है कि मैं क्लोज़ पर बंद करें का उपयोग कर रहा हूं। – Anuraj

+0

उस मामले में यूरी ने आपको निर्देश दिया है कि इस तरह की फाइल खोलने के लिए एक अलग दृष्टिकोण है, मैं इसे जाने दूंगा। – AnthonyWJones

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