2013-05-03 20 views
8

Sto utilizzando una funzione di libreria .NET che carica i file su un server e utilizza come parametro un percorso per un file. I dati che voglio inviare sono piccoli e costruiti in fase di runtime. Posso salvarlo in un file temporaneo e quindi caricarlo.Crea file in memoria non filesystem

Poiché la mia applicazione verrà distribuita in una varietà di ambienti e non so se sarò in grado di creare il file temporaneo in modo affidabile, sarebbe preferibile poter passare in un percorso a un virtual file in memoria.

Non riesco a modificare la libreria; So che esegue quanto segue sul file:

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

È possibile evitare di scrivere il file su disco?

Grazie

Edit: chiamata

La biblioteca è Webclient.UploadFile, come sottolineato nelle risposte, ci sono molte soluzioni possibili, anche utilizzando le librerie alternative, di cui ci sono molti.

+0

Quale libreria è? – JDB

+0

Mi vergogno quando una libreria funziona in modo ingenuo solo con i file su disco. Un file è una sequenza denominata di byte, quindi nel nome di tutte le cose sacre, accetta un flusso e una stringa per il nome. –

risposta

10

No, la tua libreria è fondamentalmente inflessibile in questo aspetto, dal fatto che utilizza FileStream.

Opzioni:

  • Utilizzare un RAMDrive e specificare un percorso su questo, al fine di evitare in realtà colpire disco
  • A seconda di dove la libreria viene, o richiedere una modifica (se è closed source) o solo fare la modifica se è open source
  • Utilizzare una libreria diversa. (Cosa c'è di speciale in questo?)
6

Se la libreria espone un altro metodo accettare un Stream, è possibile utilizzare un MemoryStream.

Se accetta uno SafeFileHandle, è possibile utilizzare uno MemoryMappedFile.

Altrimenti, devi essere soddisfatto con un file su disco.

2

Se ho capito bene, si desidera utilizzare uno degli altri metodi WebClient.Upload*. Ad esempio, se si dispone dei dati in un byte[], utilizzare UploadData.

Un'altra opzione, se si desidera caricare i dati come stream è utilizzare OpenWrite.

+0

Ho provato UploadString e ora ho provato UploadData. Entrambi hanno causato il riavvio del server con cui stavo :-(. Potrei scavare nel formato del POST che WebClient fa per capire esattamente dove si trova il problema, ma ciò vanificherebbe lo scopo di utilizzare un semplice client http come WebClient. File temporanei è! – Stefan

+0

@Stefan Ha causato il * riavvio del server *? Poi c'è qualcosa di molto sbagliato nel server e dovresti capire di cosa si tratta. – svick

+0

Hehe ... non è il "mio" server in quanto tale.È un dispositivo embedded connesso in rete, fuori dal mio controllo. Ci sono migliaia di queste cose sul campo. Quindi sono praticamente bloccato con l'invio di richieste in un formato che gli piace. Almeno conosco un modo per ottenere dati con successo, quindi posso conviverci! – Stefan