WriteFile vs TransmitFile per file di grandi dimensioni che devono essere eliminati dal server dopo il trasferimento

StackOverflow https://stackoverflow.com/questions/2187252

Domanda

Devo innesco utente scarica di file di grandi dimensioni a un browser web, dove creo il file da trasferire sul server, quindi eliminarlo subito dopo. Ho trovato abbastanza esempi di vedere che forse dovrei usare Response.TransmitFile o Response.WriteFile ... ma ho sentito ci sono problemi con entrambi:

WriteFile è sincrono, ma tampona il file in memoria prima di inviarlo all'utente. Dal momento che ho a che fare con file di grandi dimensioni, questo potrebbe causare problemi.

TransmitFile non tampone a livello locale in modo che funziona per file di grandi dimensioni, ma è asincrona, quindi non posso eliminare il file dopo aver chiamato TransmitFile. A quanto pare il lavaggio il file non garantisce che posso cancellare neanche?

Qual è il modo migliore di trattare con questo?

Non è il BinaryWrite anche ... potrei scorrere un flusso di file, copiarlo in segmenti?

È stato utile?

Soluzione

Ecco una buona soluzione che utilizza TransmitFile ma permette di fare qualcosa una volta che è fatto usando un delegato:

http: // migliorare .dk / blog / 2008/03/29 / risposta-TransmitFile-chiude-will-kill-tua-applicazione

Basta sostituire la registrazione alla fine con l'eliminazione dei file.

Altri suggerimenti

  

WriteFile è sincrono, ma   buffer il file in memoria prima   l'invio all'utente. Dal momento che sono   si tratta di file di grandi dimensioni, questo   potrebbe causare problemi.

Credo che è possibile disattivare il buffer per WriteFile per impostazione Response.BufferOutput = false;

Una volta che questo è stato impostato su falso si dovrebbe essere in grado di chiamare WriteFile senza buffering ...

Potrebbe commettere il file su disco (nome casuale, ecc), e iniziare a inviare, ma aggiungere una voce a una tabella DB con il nome del file temporaneo, dopo un periodo di tempo si definisce, avere un po 'andare lavoro di pulizia attraverso quelle voci DB ed eliminare il file dal disco se è invecchiato fuori.

WriteFile metodo è usato per scaricare il piccolo file dal server, il parametro di dimensione deve essere compreso tra zero ed il valore massimo Int32, prima di trasferire il file tamponi il file in memoria. TransmitFile metodo viene utilizzato per scaricare il file di grandi dimensioni dal server e non tamponare il file in memory.But quando tenta di eliminare il file durante il download è allora genera l'eccezione. Di seguito è riportato il codice che avrebbe eliminare il file dopo il download.

 FileStream fs = new FileStream(@"D:\FileDownLoad\DeskTop.zip", FileMode.OpenOrCreate);
        MemoryStream ms = new MemoryStream();
        fs.CopyTo(ms);
        context.Response.AppendHeader("content-disposition", "attachment; filename=" + "DeskTop.zip");
        context.Response.ContentType = "application/octet-stream";
        context.Response.BinaryWrite(ms.ToArray());
        fs.Close();
        File.Delete(@"D:\FileDownLoad\DeskTop.zip");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top