के तहत एक फ़ाइल का विस्तार नहीं करेगा विंडोज़ के तहत, यह एफ # कोड 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()
यह एपीआई की पतली रक्षा की तरह लगता है :) फ़ंक्शन के लिए दस्तावेज़ उन परिस्थितियों को सूचीबद्ध करते हैं जिनके तहत एक ArgumentException उठाया जा सकता है और वे क्षमता तर्क का उल्लेख नहीं करते हैं। मुझे लगता है कि आप तर्क दे सकते हैं कि .NET अनुबंध "जो भी अंतर्निहित ओएस ऐसा करने जैसा लगता है" लेकिन यह एपीआई चलाने का एक खराब तरीका है। – Darren
@ डैरेन: रक्षा के रूप में नहीं, वास्तव में तथ्य के बयान के रूप में मतलब था। आमतौर पर सादगी के लिए आवश्यकता से बाहर ओएस बबल के कार्यान्वयन विवरण, यह उपयोगकर्ता के लिए आदर्श नहीं है। – Guvante
@ डेरेन: मामलों को और भी खराब बनाने के लिए, विधि को कॉल करने का एकमात्र विश्वसनीय तरीका सटीक फ़ाइल आकार के साथ है। विंडोज़ फ़ाइल आकार से कम अस्वीकार करता है, और यूनिक्स पर मोनो फ़ाइल आकार से अधिक अस्वीकार करता है। – Guvante