Мне нужно ежемесячно переносить большие файлы резервных копий с серверов моих клиентов на мой сервер.

У меня есть клиенты, работающие под управлением SQL Server Express 2005, и каждый из них нуждается в резервной копии каждый месяц, и эту резервную копию необходимо перемещать на наш сервер на случай, если они потеряют свою резервную копию. Наше программное обеспечение автоматически создает резервную копию базы данных каждый месяц, но нам приходится копировать ее вручную. Есть ли способ автоматизировать копирование файлов размером до 800 мегабайт с их машины на нашу каждый месяц, возможно, с помощью FTP? Кроме того, при использовании FTP он должен поддерживать возобновление в случае, если мы потеряем соединение через три querters, что происходит довольно часто. Я хотел бы записать эту функциональность в наше приложение VB.net, для которого требуется только платформа .net и не используются какие-либо сторонние элементы управления.


person henry    schedule 19.02.2010    source источник


Ответы (3)


Я думаю, что здесь было бы лучше, если бы вы использовали что-то вроде RSync, а не домашнее решение.

person Anton Gogolev    schedule 19.02.2010

Другой альтернативой может быть использование такой программы, как SyncBack, которая поддерживает синхронизацию по FTP, может быть запланирована для запуска ежедневно/еженедельно/ежемесячно и работала для меня, чтобы делать то, о чем вы говорите, в течение многих лет. Я не уверен насчет возобновления передачи по FTP, но он отлично справляется с резервным копированием через FTP.

person Logan    schedule 19.02.2010

Это, безусловно, выполнимо либо с классами WebClient, либо с серией классов (Ftp) WebRequest/WebResponse - и я могу дать вам пример кода, если требуется, - но если у вас нет конкретного бизнес-кейса для развертывания вашего собственного, что-то вроде RSync может быть лучше выбор.

РЕДАКТИРОВАТЬ;

Маршрут WebClient является самым простым, но он не дает вам большого контроля;

Imports System.Net
...
Dim Client As New WebClient
Client.DownloadFile("ftp://ftp.example.com/Database.bak", "D:\Backups\Database.bak")

Если вы хотите немного больше контроля и управления возобновлением работы FTP, то что-то вроде этого поможет;

Public Sub TransferFile(ByVal SourcePath As String, ByVal DestinationPath As String)

    Dim SourceRequest As FtpWebRequest

    Dim Buffer(4095) As Byte
    Dim BytesRead As Integer

    ' Assumes source is on FTP server...
    SourceRequest = DirectCast(WebRequest.Create(SourcePath), FtpWebRequest)
    SourceRequest.Method = WebRequestMethods.Ftp.DownloadFile

    ' If we already have a local file, then resume from the end of it...
    SourceRequest.ContentOffset = If(File.Exists(DestinationPath), New FileInfo(DestinationPath).Length, 0)

    ' Assume destination file is local/UNC file. FileMode.Append will create a new file if one doesn't exist.
    Using DestinationFile As New FileStream(DestinationPath, FileMode.Append, FileAccess.Write, FileShare.None)
        Using SourceResponse As WebResponse = SourceRequest.GetResponse()
            Using SourceStream As Stream = SourceResponse.GetResponseStream()

                Do

                    BytesRead = SourceStream.Read(Buffer, 0, Buffer.Length)
                    DestinationFile.Write(Buffer, 0, BytesRead)

                    ' Calculate speed, progress, show to user/log, etc...

                Loop While BytesRead > 0

            End Using
        End Using
    End Using

End Sub

Это предполагает, что вы передаете с FTP -> локально. Имя пользователя/пароль можно указать как в SourcePath так и так; ftp://имя пользователя:пароль@ftp.mysite.co.uk

Надеюсь это поможет.

person Gareth Wilson    schedule 19.02.2010
comment
Привет, Гарет, спасибо. Не могли бы вы прислать мне часть этого примера кода для просмотра? Я бы предпочел включить его в свой проект и не зависеть от какого-либо другого программного обеспечения. Большое спасибо. Генри. - person henry; 22.02.2010