在内存中创建文件而非文件系统

11

我正在使用一个.NET库函数,用于将文件上传到服务器,并将文件路径作为参数。我想要发送的数据很小,是在运行时构造的。我可以将数据保存到临时文件中,然后上传。

由于我的应用程序将部署在各种环境中,而且我不知道是否能够可靠地创建临时文件,因此最好能够传递一个指向内存中虚拟文件的路径。

我无法更改库;我知道它对文件执行以下操作:

LibraryUploadFunction(string filename) {
    fileName = Path.GetFullPath(fileName);
    FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    ...
}

有没有可能避免将文件写入磁盘?

谢谢

编辑:

库调用为Webclient.UploadFile,正如答案中所指出的,有许多解决方法可行,包括使用替代库,其中有许多。


1
当一个库天真地只能使用磁盘上的文件时,我会感到不安。文件是一系列命名的字节,所以为了万物的神圣,请接受流和字符串作为名称。 - Ronnie Overby
3个回答

11

不,你的库在这个方面上从根本上是不灵活的,因为它使用了FileStream

选项:

  • 使用ramdrive并指定该路径,以避免实际访问磁盘
  • 根据库的来源,如果是封闭源代码,请求更改,否则就直接进行更改(如果是开源的)
  • 使用其他库。(这个库有什么特别之处?)

7
如果库公开了另一个接受Stream的方法,您可以使用MemoryStream
如果它接受SafeFileHandle,则可以使用MemoryMappedFile
否则,您只能满足于磁盘上的文件。

2
如果我理解你的意思正确,你想要使用其他的WebClient.Upload*方法之一。例如,如果你的数据是一个byte[]数组,可以使用UploadData方法。
另一个选项,如果你想要将数据作为流上传,可以使用OpenWrite方法。

我尝试了UploadString,现在我尝试了UploadData。两者都导致我正在通信的服务器重新启动 :-(。我可以深入挖掘WebClient生成的POST格式,以确定问题的确切位置,但这将违背使用简单http客户端WebClient的目的。那就用临时文件吧! - Stefan
@Stefan 它导致你的服务器重新启动?那么你的服务器肯定出了什么问题,你应该找出是什么问题。 - svick
呵呵...这并不是“我的”服务器。它是一个网络连接的嵌入式设备,超出了我的控制范围。在现场有成千上万个这样的设备。所以基本上我只能按照它喜欢的格式发送请求。至少我知道一种成功将数据传输到它的方法,所以我可以接受这种情况! - Stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接