Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Закачиваю файл на FTP-сервер, где другая программа его должна забрать / 4 сообщений из 4, страница 1 из 1
29.05.2012, 14:11
    #37816345
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачиваю файл на FTP-сервер, где другая программа его должна забрать
Мое почтение всем и благодарность заранее.

Закачиваю файл на FTP-сервер. Один нюанс: на сервере бежит некая программа (не моя), которая ждет моего файла и при его получении моментально его перемещает в другое место (недоступное для меня). Собственно, взаимодействие с этой программой (создание файла для нее) и есть моя задача.

Вот код, который я нашел в Интернете (в этом форуме тоже видел ссылку на нечто похожее) и слегка причесал под свои нужды:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
            Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf validateCert
            Dim sAdd As String = IIf(sAction = "NLST", "", "/" & sFile)
            Dim request As FtpWebRequest = DirectCast(WebRequest.Create(msFtpServer & sAdd), FtpWebRequest)
            request.Method = sAction
            request.EnableSsl = True
            request.Credentials = oNc
            Select Case sAction
                Case "RENAME"
                    request.RenameTo = sNewName
                    request.KeepAlive = False
                    request.GetResponse.Close()
                    Exit Sub
            End Select
            Dim response As FtpWebResponse = DirectCast(request.GetResponse(), FtpWebResponse)
            Select Case sAction
                Case "NLST"
                    Dim reader As New StreamReader(response.GetResponseStream())
                    Dim str As String = reader.ReadLine
                    cFiles = New Collection
                    Do Until str Is Nothing
                        Try
                            cFiles.Add(str, str)
                        Catch ex As Exception
                        End Try
                        str = reader.ReadLine
                    Loop
                    reader.Close()
                Case "STOR"
                    Dim oFile As FileInfo = New FileInfo(msTmpStorage & "\" & sFile)
                    Dim fileContents(oFile.Length) As Byte
                    Using fr As FileStream = oFile.OpenRead
                        fr.Read(fileContents, 0, Convert.ToInt32(oFile.Length))
                    End Using
                    Using writer As Stream = request.GetRequestStream
                        writer.Write(fileContents, 0, fileContents.Length)
                    End Using
                Case "RETR"
                    Dim responseStream As Stream = response.GetResponseStream
                    Dim fs As New FileStream(msTmpStorage & "\" & sFile, FileMode.Create)
                    Dim buffer(2047) As Byte
                    Dim read As Integer = 1
                    Do While read <> 0
                        read = responseStream.Read(buffer, 0, buffer.Length)
                        fs.Write(buffer, 0, read)
                    Loop
                    fs.Flush()
                    fs.Close()
                    responseStream.Close()
            End Select
            response.Close()


Пытаюсь обращаться к этому коду двумя способами, в обоих случаях возникает проблема. А именно:

Способ 1. Просто запускаю с параметром sAction="STOR". В тот момент, когда у меня исполняется строка Dim response, на сервере уже появляется файл (пока нулевого размера). Та программа его сразу забирает, не дожидаясь, пока он создастся полностью. Потом она его забирает еще раз, но это создает им проблемы.

Способ 2. Запускаю сначала с параметром sAction="STOR", но с другим именем файла, а потом с параметром sAction="RENAME". Тогда на файле остается какая-то блокировка, из-за которой та программа не может его забрать. При этом я сам руками могу этот файл перемещать и удалять без проблем.

Что мне изменить, чтобы оно заработало - хоть по первому способу, хоть по второму?
...
Рейтинг: 0 / 0
29.05.2012, 14:23
    #37816372
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачиваю файл на FTP-сервер, где другая программа его должна забрать
P.S. В приведенном отрывке используются некоторые мои переменные, которых я не пояснил. Надеюсь, что их смысл понятен.
...
Рейтинг: 0 / 0
06.06.2012, 12:17
    #37827323
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачиваю файл на FTP-сервер, где другая программа его должна забрать
Раз никто не отвечает, доложу о результатах сам.

Перенес строчку Dim response в конец кода, всё заработало. Возможно, это вообще лишняя переменная и ее не надо открывать и закрывать, это я не проверял. Не проверял я и способ 2 с ренеймом, только предполагаю, что можно попробовать расщепить команду request.GetResponse.Close() на две, как в остальных случаях (одной командой Dim response, а второй Close).

Однако теперь мне напомнили про другую проблему. Этот код

Код: vbnet
1.
2.
3.
4.
5.
6.
                    Using fr As FileStream = oFile.OpenRead
                        fr.Read(fileContents, 0, Convert.ToInt32(oFile.Length))
                    End Using
                    Using writer As Stream = request.GetRequestStream
                        writer.Write(fileContents, 0, fileContents.Length)
                    End Using


создает файл на один байт длиннее, чем надо. В конце добавляется какой-то лишний символ. Догадываюсь, что дело в 0, fileContents.Length, буду экспериментировать, но если кто-то точно знает, как надо исправить, то буду благодарен.
...
Рейтинг: 0 / 0
11.06.2012, 17:27
    #37834515
Владимир Саныч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закачиваю файл на FTP-сервер, где другая программа его должна забрать
Владимир СанычДогадываюсь, что дело в 0, fileContents.Length
Догадка была верна. Исправил на 0, fileContents.Length - 1, проблема исчезла.

Теперь если у кого-то возникнут похожие вопросы, то в этом форуме будет топик на эту тему.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Закачиваю файл на FTP-сервер, где другая программа его должна забрать / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]