2016-04-24 2 views
0

Я не могу использовать WebClient, прежде чем кто-нибудь подскажет, что, поскольку это делает мое законное приложение похожим на вирус McAfee. Поэтому, пожалуйста, не предлагайте этого.HttpWebRequest не правильно загружает файл

У меня есть файл binary.txt, хранящийся на моем сервере. Это примерно 1 240 килобайт. Тем не менее, HttpWebRequest загружает случайные суммы от 1300 КБ до 1,700 КБ.

HttpWebRequest httpRequest = (HttpWebRequest) 
WebRequest.Create("http://deviantsmc.com/binary.txt"); 
httpRequest.Method = WebRequestMethods.Http.Get; 
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
Stream httpResponseStream = httpResponse.GetResponseStream(); 
byte[] buffer = new byte[1240]; 
int bytesRead = 0; 
StringBuilder sb = new StringBuilder(); 

//FileStream fileStream = File.Create(@"tcontent.txt"); 
while ((bytesRead = httpResponseStream.Read(buffer, 0, 1240)) != 0) 
{ 
    sb.Append(Encoding.ASCII.GetString(buffer)); 
    //fileStream.Write(buffer, 0, bytesRead); 
} 
File.WriteAllText(@"tcontent1.txt", sb.ToString()); 

(Содержимое файла binary.txt на сервере в формате ASCII, поэтому я строка Кодирование в ASCII, а).

Это, как я закодирован этот текстовый файл (на этом сервере)

Моего файл в основном это:

byte[] bytes = File.ReadAllBytes("binary.txt"); 
String encBytes = Encoding.ASCII.GetString(bytes); 
File.WriteAllText(file("binary.txt"), encBytes); 

Я связался с AV компании о WebDownloader рассматривается как некий вредоносный импорт в C# , но они не вернулись ко мне, поэтому я вынужден использовать HttpWebRequest.

+0

загрузить файл в браузере, но он не похож на кодировку ANSI. – kennyzx

+0

Я опубликовал, как я кодирую мои байты этого текстового файла. –

+0

Итак, вы читаете binary.txt как ASCII, а затем записываете строку обратно в тот же файл, верно? Каково значение 'encBytes' в отладчике, является ли это читаемой строкой? – kennyzx

ответ

4

Если ваша цель состоит в том, чтобы извлечь этот двоичный файл и записать его на диск, вы можете просто скопировать поток в файл с помощью метода CopyTo, который существует на объекте Stream.

Ваш файл выглядит как сломанный zip-файл с учетом первых символов, которые являются PK, и используется в zip-специфике.

От wikipedia:

Viewed as an ASCII string this reads "PK", the initials of the inventor Phil Katz. Thus, when a .ZIP file is viewed in a text editor the first two bytes of the file are usually "PK".

Я использовал 7-Zip, чтобы открыть файл, так как по умолчанию Windows, не принял его в качестве действительного файла. Он содержит файл manifest.mf, но сам контент отсутствует. сам файл имеет размер 1.269.519 байт.

HttpWebRequest httpRequest = (HttpWebRequest) 
WebRequest.Create("http://deviantsmc.com/binary.txt"); 
httpRequest.Method = WebRequestMethods.Http.Get; 
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
Stream httpResponseStream = httpResponse.GetResponseStream(); 

// create and open a FileStream, using calls dispose when done 
using(var fs= File.Create(@"c:\temp\bin.7z")) 
{ 
    // Copy all bytes from the responsestream to the filestream 
    httpResponseStream.CopyTo(fs); 
} 
+0

Некоторые антивирусы считают «httpResponseStream.CopyTo (fs);» является попыткой загрузить вредоносный файл, поэтому они сразу же удаляют программу. –

+0

Я получаю эту ошибку: «Доступ к пути« C \ Users \ xxx \ Desktop »запрещен». Есть идеи? –

+0

@ k.troy2012 yes, сохраните файл в папке, к которой у вас есть доступ, и убедитесь, что вы используете путь ** AND ** имя файла. c: \ temp \ file.zip будет работать (если вы сначала создали каталог с именем 'temp'). Также используйте строку '@" c: \ your \ path \ и \ file.here "типа. – rene

2

Я думаю, что вы должны написать целые двоичные данные в локальный файл, а не кодировать его сегментарно, вы можете попробовать это:

HttpWebRequest httpRequest = (HttpWebRequest) 
    WebRequest.Create("http://deviantsmc.com/binary.txt"); 
    httpRequest.Method = WebRequestMethods.Http.Get; 
    HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
    Stream httpResponseStream = httpResponse.GetResponseStream(); 
    using (BinaryReader responseReader = new BinaryReader(httpResponseStream.GetResponseStream())) 
    { 
     byte[] bytes = responseReader.ReadBytes((int)response.ContentLength); 
     using (BinaryWriter sw = new BinaryWriter(File.OpenWrite("tcontent1.txt"))) 
     { 
      sw.Write(bytes); 
      sw.Flush(); 
      sw.Close(); 
     } 
    } 

Надеется, что это может помочь