2009-06-14 5 views
19

In C#. NET, voglio recuperare i dati da un URL e salvarlo in un file in binario.Come OTTENERE dati da un URL e salvarlo in un file in binario in C# .NET senza il pasticcio di codifica?

Utilizzo di HttpWebRequest/Streamreader per leggere in una stringa e il salvataggio utilizzando StreamWriter funziona bene con ASCII, ma i caratteri non ASCII vengono storpiati perché il sistema pensa di doversi preoccupare delle codifiche, della codifica in Unicode o da qualsiasi altra cosa.

Qual è il modo più semplice per OTTENERE dati da un URL e salvarlo in un file, binario, così com'è?

// This code works, but for ASCII only 
String url = "url..."; 
HttpWebRequest request = (HttpWebRequest) 
WebRequest.Create(url); 

// execute the request 
HttpWebResponse response = (HttpWebResponse) 
request.GetResponse(); 

// we will read data via the response stream 
Stream ReceiveStream = response.GetResponseStream(); 
StreamReader readStream = new StreamReader(ReceiveStream); 
string contents = readStream.ReadToEnd(); 

string filename = @"..."; 

// create a writer and open the file 
TextWriter tw = new StreamWriter(filename); 
tw.Write(contents.Substring(5)); 
tw.Close(); 

risposta

53

risposta minimalista:

using (WebClient client = new WebClient()) { 
    client.DownloadFile(url, filePath); 
} 

O in PowerShell (suggerito una modifica anonimo):

[System.Net.WebClient]::WebClient 
$client = New-Object System.Net.WebClient 
$client.DownloadFile(URL, Filename) 
+0

Perfetto proprio quello di cui avevo bisogno grazie! – jms

+0

Sarebbe bello se potesse scaricare file gzippati? – Greg

+0

Non sarebbe giusto. –

13

Basta non utilizzare alcun StreamReader o TextWriter. Salva in un file con FileStream non elaborato.

String url = ...; 
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); 

// execute the request 
HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 

// we will read data via the response stream 
Stream ReceiveStream = response.GetResponseStream(); 

string filename = ...; 

byte[] buffer = new byte[1024]; 
FileStream outFile = new FileStream(filename, FileMode.Create); 

int bytesRead; 
while((bytesRead = ReceiveStream.Read(buffer, 0, buffer.Length)) != 0) 
    outFile.Write(buffer, 0, bytesRead); 

// Or using statement instead 
outFile.Close() 
+2

dimentica di usare outFile.Close(). – Rios

+0

Grazie, @Rios, aggiunto (o meglio ancora 'using'). –

0

Questo è quello che io uso:

sUrl = "http://your.com/xml.file.xml"; 
rssReader = new XmlTextReader(sUrl.ToString()); 
rssDoc = new XmlDocument(); 

WebRequest wrGETURL; 
wrGETURL = WebRequest.Create(sUrl); 

Stream objStream; 
objStream = wrGETURL.GetResponse().GetResponseStream(); 
StreamReader objReader = new StreamReader(objStream, Encoding.UTF8); 
WebResponse wr = wrGETURL.GetResponse(); 
Stream receiveStream = wr.GetResponseStream(); 
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); 
string content = reader.ReadToEnd(); 
XmlDocument content2 = new XmlDocument(); 

content2.LoadXml(content); 
content2.Save("direct.xml"); 
Non