Загрузка файлов с удаленного сервера - PullRequest
1 голос
/ 26 января 2009

Я использую C # и консольное приложение, и я использую этот скрипт для загрузки файлов с удаленного сервера. Там есть пара вещей, которые я хочу добавить. Во-первых, когда он записывает в файл, он не учитывает перевод строки. Кажется, что он запускает определенное количество байтов, а затем переходит на новую строку. Я хотел бы сохранить тот же формат, что и файл, из которого он читает. Во-вторых, на сервере нужно загрузить несколько файлов .jpg. Как я могу использовать этот скрипт для загрузки нескольких файлов .jpg

public static int DownLoadFiles(String remoteUrl, String localFile)
    {
        int bytesProcessed = 0;

        // Assign values to these objects here so that they can
        // be referenced in the finally block
        StreamReader remoteStream = null;
        StreamWriter localStream = null;
        WebResponse response = null;

        // Use a try/catch/finally block as both the WebRequest and Stream
        // classes throw exceptions upon error
        try
        {
            // Create a request for the specified remote file name
            WebRequest request = WebRequest.Create(remoteUrl);
            request.PreAuthenticate = true;
            NetworkCredential credentials = new NetworkCredential("id", "pass");
            request.Credentials = credentials;

            if (request != null)
            {
                // Send the request to the server and retrieve the
                // WebResponse object
                response = request.GetResponse();
                if (response != null)
                {
                    // Once the WebResponse object has been retrieved,
                    // get the stream object associated with the response's data
                    remoteStream = new StreamReader(response.GetResponseStream());

                    // Create the local file
                    localStream = new StreamWriter(File.Create(localFile));

                    // Allocate a 1k buffer
                    char[] buffer = new char[1024];
                    int bytesRead;

                    // Simple do/while loop to read from stream until
                    // no bytes are returned
                    do
                    {
                        // Read data (up to 1k) from the stream
                        bytesRead = remoteStream.Read(buffer, 0, buffer.Length);

                        // Write the data to the local file
                        localStream.WriteLine(buffer, 0, bytesRead);

                        // Increment total bytes processed
                        bytesProcessed += bytesRead;
                    } while (bytesRead > 0);
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Close the response and streams objects here
            // to make sure they're closed even if an exception
            // is thrown at some point
            if (response != null) response.Close();
            if (remoteStream != null) remoteStream.Close();
            if (localStream != null) localStream.Close();
        }

        // Return total bytes processed to caller.
        return bytesProcessed;

Ответы [ 2 ]

4 голосов
/ 26 января 2009

Почему бы вам не использовать WebClient.DownloadData или WebClient.DownloadFile вместо?

WebClient client = new WebClient();
client.Credentials = new NetworkCredentials("id", "pass");
client.DownloadFile(remoteUrl, localFile);

Кстати, правильный способ скопировать поток в другой - это не то, что вы сделали. Вы вообще не должны читать char[], так как при загрузке двоичного файла вы можете столкнуться с проблемами кодирования и конца строки. Вызов метода WriteLine также проблематичен. Правильный способ скопировать содержимое потока в другой:

void CopyStream(Stream destination, Stream source) {
   int count;
   byte[] buffer = new byte[BUFFER_SIZE];
   while( (count = source.Read(buffer, 0, buffer.Length)) > 0)
       destination.Write(buffer, 0, count);
}

Класс WebClient гораздо проще в использовании, и я предлагаю использовать его вместо этого.

1 голос
/ 26 января 2009

Причина, по которой вы получаете ложные символы новой строки в файле результатов, заключается в том, что StreamWriter.WriteLine () помещает их туда. Попробуйте вместо этого использовать StreamWriter.Write ().

Что касается загрузки нескольких файлов, не могли бы вы просто запустить функцию несколько раз, передав ей URL-адреса нужных вам файлов?

...