2012-03-27 13 views
6

के तहत एक फ़ाइल का विस्तार नहीं करेगा विंडोज़ के तहत, यह एफ # कोड 12 बाइट्स से 655346 बाइट्स तक एक फ़ाइल का विस्तार करेगा जब क्षमता तर्क (अंतिम तर्क) एक बड़े आकार पर सेट किया गया है अंतर्निहित फ़ाइल की तुलना में। मेमोरी मैप किए गए फ़ाइल को विस्तारित करने का यह सबसे साफ तरीका प्रतीत होता है। मोनो/लिनक्स के तहत यह एक ArgumentException फेंकता है: क्षमता तब तक जब तक मैप किए गए क्षमता तक फ़ाइल न हो। क्या फ़ाइल का विस्तार करने के लिए मोनो प्राप्त करने का कोई साफ तरीका है या क्या मैप मैप करने से पहले मुझे फाइल को दोबारा जोड़ना है?MemoryMappedFiles.MemoryMappedFile.MreoryMromFile.CreateFromFile लिनक्स/मोनो

let Main() = 
    let path = "parts.pash" 
    let l = 65536L 
    let mm = MemoryMappedFiles.MemoryMappedFile.CreateFromFile(path,FileMode.OpenOrCreate,"pashmap",l) 

    () 

Main() 

त्रुटि संदेश

बिना क्रिया के अपवाद: System.ArgumentException: क्षमता System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile (System.String पथ, FileMode मोड, System.String mapName, Int64 पर क्षमता, MemoryMappedFileAccess पहुँच) [0x00000] में: 0 पर System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile (System.String पथ, FileMode मोड, System.String mapName, Int64 क्षमता) में [0x00000]: 0 पर Program.Main() [0x00000] में: 0 पर $ Program.main @() [0x00000] में:। मोनो के 0

संस्करण:

[[email protected] pash]$ mono --version 
Mono JIT compiler version 2.10.1 (tarball Mon Apr 4 10:40:52 PDT 2011) 
Copyright (C) 2002-2011 Novell, Inc and Contributors. www.mono-project.com 
     TLS:   __thread 
     SIGSEGV:  altstack 
     Notifications: epoll 
     Architecture: x86 
     Disabled:  none 
     Misc:   softdebug 
     LLVM:   supported, not enabled. 
     GC:   Included Boehm (with typed GC and Parallel Mark) 

संपादित करें: यह प्रतीत होता है कि स्मृति मानचित्रण के विभिन्न अंतर्निहित व्यवहार एपीआई में सामने आ रहा है तो तुम होने के लिए सही लंबाई करने के लिए फ़ाइल अपने आप को विस्तार करने के लिए मंच तटस्थ

let f = File.Open(path,FileMode.Append,FileAccess.Write) 
let pad = l- FileInfo(path).Length 
let padding = Array.create (int32 pad) 0uy 
f.Write(padding,0,int pad) 
f.Close() 

उत्तर

4

की नेट कार्यान्वयन को देखते हुए की जरूरत हैउस कार्यक्षमता का कोई कार्यान्वयन नहीं है। तर्क जांच के अलावा, यह विंडोज एपीआई कॉल के चारों ओर एक पतला आवरण है जो मैं बता सकता हूं।

इस कारण से बड़ी फ़ाइल बनाने की क्षमता .NET भूमि से एक खुश संयोग है, इसलिए यह कोई आश्चर्य की बात नहीं है कि अंतर्निहित ऑपरेटिंग सिस्टम समान कार्यक्षमता की अनुमति नहीं देता है तो मोनो ने उस क्षमता को हटा दिया है।

अधिक आसानी से रखें, क्योंकि .NET संस्करण तकनीकी रूप से फ़ाइल को विस्तारित नहीं करता है, विंडोज एपीआई करता है।

+0

यह एपीआई की पतली रक्षा की तरह लगता है :) फ़ंक्शन के लिए दस्तावेज़ उन परिस्थितियों को सूचीबद्ध करते हैं जिनके तहत एक ArgumentException उठाया जा सकता है और वे क्षमता तर्क का उल्लेख नहीं करते हैं। मुझे लगता है कि आप तर्क दे सकते हैं कि .NET अनुबंध "जो भी अंतर्निहित ओएस ऐसा करने जैसा लगता है" लेकिन यह एपीआई चलाने का एक खराब तरीका है। – Darren

+0

@ डैरेन: रक्षा के रूप में नहीं, वास्तव में तथ्य के बयान के रूप में मतलब था। आमतौर पर सादगी के लिए आवश्यकता से बाहर ओएस बबल के कार्यान्वयन विवरण, यह उपयोगकर्ता के लिए आदर्श नहीं है। – Guvante

+1

@ डेरेन: मामलों को और भी खराब बनाने के लिए, विधि को कॉल करने का एकमात्र विश्वसनीय तरीका सटीक फ़ाइल आकार के साथ है। विंडोज़ फ़ाइल आकार से कम अस्वीकार करता है, और यूनिक्स पर मोनो फ़ाइल आकार से अधिक अस्वीकार करता है। – Guvante

0

संभावित रूप से बड़ी सरणी आवंटित करने के बजाय, और फिर इसे लिखने के बजाय, यह संभवतः अधिक कुशल है। मैं एफ # कोड का यकीन नहीं है, लेकिन सी # में आप की तरह कुछ करना चाहते हैं:

filestream.Seek(length - 1, SeekOrigin.Begin); 
filestream.WriteByte(0); 

मैक ओएस एक्स से ही मांग पर मोनो 2.10.8 के साथ पर्याप्त नहीं था, मैं कम से कम एक लिखना पड़ा बाइट, फाइलस्ट्रीम के लिए एमएसडीएन दस्तावेज के बावजूद। यह कहकर कि यह फाइल का विस्तार करेगा।

ऐसा लगता है जैसे मोनो अपने मेमोरीमैप्डफाइल कार्यान्वयन में कुछ ऐसा कर सकता है ताकि इसे विंडोज पर नेट के साथ अधिक संगत बनाया जा सके।