В Windows этот код F# будет расширять файл, скажем, с 12 байтов до 655346 байт, когда аргумент емкости (последний аргумент) установлен на больший размер, чем базовый файл. Кажется, это самый чистый способ расширить файл с отображением памяти. В моно/линукс выдается исключение ArgumentException: capacity, если длина файла не превышает сопоставленную емкость. Есть ли чистый способ получить моно для расширения файла или мне нужно предварительно расширить файл, прежде чем я смогу сопоставить?
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 в .$Программа.main@ () [0x00000] in:0
Версия mono:
[daz@clowder 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)
РЕДАКТИРОВАТЬ: кажется, что в API представлено различное базовое поведение отображения памяти, поэтому вам нужно самостоятельно расширить файл до нужной длины, чтобы быть нейтральным к платформе
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()