MemoryMappedFiles.MemoryMappedFile.CreateFromFile不会扩展linux / mono下的文件

时间:2012-03-27 18:28:10

标签: f# mono

在windows下,当容量参数(最后一个参数)设置为比底层文件大时,此F#代码将文件从12个字节扩展到655346个字节。这似乎是扩展内存映射文件最干净的方法。在mono / linux下,它抛出一个ArgumentException:capacity,除非该文件与映射的容量一样长。是否有一种干净的方式来获取单声道扩展文件,或者我必须先预先扩展文件才能映射?

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

    ()

Main()

错误消息

  

未处理的异常:System.ArgumentException:capacity at   System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile   (System.String路径,FileMode模式,System.String mapName,Int64   capacity,MemoryMappedFileAccess access)[0x00000] in:0 at   System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile   (System.String路径,FileMode模式,System.String mapName,Int64   容量)[0x00000] in:0在Program.Main()   [0x00000] in:0 at   。$ Program.main @()[0x00000] in:0

单声道版本:

[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()

2 个答案:

答案 0 :(得分:4)

查看CreateFromFile的.NET实现,没有实现该功能。除了参数检查之外,从我能说的内容来看,它是Windows API调用的一个纤薄的包装器。

由于这个原因,创建一个更大的文件的能力更像是.NET领域的巧合,所以如果基础操作系统不允许类似的功能,Mono就会删除这种能力也就不足为奇了。

更简单,不太可能,因为.NET版本在技术上也不扩展文件,Windows API也是如此。

答案 1 :(得分:0)

不是分配一个可能很大的数组,然后编写它,而是寻求更有效。我不确定F#代码,但在C#中你会做类似的事情:

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

Mac OS X上的Mono 2.10.8本身并不足够,我不得不写至少一个字节,尽管FileStream.Seek的MSDN文档说它会扩展文件。

似乎Mono可以在他们的MemoryMappedFile实现中做类似的事情,使其与Windows上的.Net更兼容。