Create file in memory not filesystem

13,421

Solution 1

No, your library is fundamentally inflexible in this aspect, by the fact that it uses FileStream.

Options:

  • Use a ramdrive and specify a path on that, in order to avoid actually hitting disk
  • Depending on where the library comes from, either request a change (if it's closed source) or just make the change if it's open source
  • Use a different library. (What's special about this one?)

Solution 2

If the library exposes another method accepting a Stream, you could use a MemoryStream.

If it accepts a SafeFileHandle, you could use a MemoryMappedFile.

Otherwise, you'll have to be satisfied with a file on disk.

Solution 3

If I understand you correctly, you want to use one of the other WebClient.Upload* methods. For example, if you have your data in a byte[], use UploadData.

Another option, if you want to upload the data as a stream is to use OpenWrite.

Share:
13,421
Stefan
Author by

Stefan

Updated on July 03, 2022

Comments

  • Stefan
    Stefan almost 2 years

    I am using a .NET library function that uploads files to a server, and takes as a parameter a path to a file. The data I want to send is small and constructed at runtime. I can save it to a temporary file and then upload it.

    Since my application will be deployed in a variety of environments, and I don't know if I'll be able to create the temporary file reliably, it would be preferable to be able to pass in a path to a virtual file in memory.

    I can't change the library; I know it executes the following on the file:

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

    Is it possible to avoid writing the file to disk?

    Thanks

    Edit:

    The library call is Webclient.UploadFile, as pointed out in the answers, there are many workarounds possible, including using alternative libraries, of which there are many.

  • Stefan
    Stefan about 11 years
    I did try UploadString, and now I've tried UploadData. Both caused the server I was communicating with to reboot :-(. I could dig into the format of the POST that WebClient makes to figure out exactly where the problem is, but that would defeat the purpose of using a simple http client like WebClient. Temporary files it is!
  • svick
    svick about 11 years
    @Stefan It caused your server to reboot? Then there is something very wrong with your server and you should figure out what it is.
  • Stefan
    Stefan about 11 years
    Hehe...it's not "my" server as such. It's a network connected embedded device, which is out of my control. There are thousands of these things in the field. So pretty much I'm stuck with sending requests in a format it likes. At least I know of one way to get data to it successfully, so I can live with that!