MemoryMappedFiles.MemoryMappedFile.CreateFromFile не будет расширять файл под linux/mono.

В 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()
6
задан Darren 28 March 2012 в 22:35
поделиться