Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Пересылка файлов через MS Comm Добавлено: 17.12.03 08:41  

Автор вопроса:  Zorg

Два компа соединились через модем (при помощи MSComm),как можно передать файл с одного на другой?(если файл ещё и большой)

Ответить

  Ответы Всего ответов: 3  

Номер ответа: 1
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #1 Добавлено: 17.12.03 20:02

Обязательно через Comm или можно WinSock??

Ответить

Номер ответа: 2
Автор ответа:
 Mace [F.T.L.]



ICQ: 265477716 

Вопросов: 0
Ответов: 11
 Профиль | | #2 Добавлено: 18.12.03 01:45

Public Sub SendFile(fname As String, blocksize As Integer)

On Error GoTo exit1:
Dim data() As Byte
Dim Outfile As TekFile
Dim OtprFile_temp As String
Outfile.BlockPeredProverkoj = FrmOpt.Slider2.Value
If fname = "" Then
 Exit Sub
End If
Outfile.Name = Dir(fname)
If Outfile.Name = "" Then
 MsgBox "Файл " + fname + " не найден", vbCritical
End If
Outfile.Size = FileLen(fname)
If Outfile.Size = 0 Then
 OtprFile_temp = MsgBox("Размер " + fname + " - 0" + vbCrLf + "Продолжить ?", vbCritical + vbYesNo) '!!!!!!!!!!!!!!!
 If OtprFile_temp = 7 Then Exit Sub
End If
Outfile.blocksize = blocksize
FileSend.Label15.Caption = Outfile.blocksize
Do While Otp_Cancel = False
 OtprFile_temp = "<" + "0;" + Encode64(Outfile.Name) + ";" + CStr(Outfile.Size) + ";" + CStr(Outfile.blocksize) + ">"
 Label5.Caption = Label5.Caption + Len(OtprFile_temp)
 MSComm1.Output = OtprFile_temp
 FileSend.Label20.Caption = Outfile.Name
 FileSend.Visible = True
 FileSend.Label8.Caption = Outfile.Size
 OtprFile_temp = WaitForAnswer(1, "")
 Outfile.Block = 1
 Close #1
 If OtprFile_temp <> "" Then
  Outfile.Block = OtprFile_temp
  If OtprFile_temp <> 1 Then Sysmes "Продолжение прерванной закачки с " + CStr(Outfile.Block) + "-го блока.", 0, True, True, Text2
  Exit Do
 Else
  Sysmes "Нет ответа на запрос о принятии файла - повторный запрос.", 0, True, True, Text2
 End If
Loop
'Call PrnFile_Timer ''''''''''''''''''''''''''
Outfile.BlockPeredProverkoj = FrmOpt.Slider2.Value
Outfile.DoProverki = Outfile.BlockPeredProverkoj
Open fname For Binary As #1
OtpData:

Do While Outfile.blocksize < Outfile.Size - Loc(1)
 If Otp_Cancel = True Then Exit Sub
 ReDim data(0 To Outfile.blocksize - 1) As Byte
OtpData_k:
 Seek #1, SeekPos(Outfile, Outfile.blocksize)
 Get #1, , data()
 FileSend.Label9.Caption = Loc(1)
 FileSend.Label10.Caption = Outfile.Size - Loc(1)
 OtprFile_temp = CompressByteArray(data(), 1) '!!!!!!!!!!!!!!!!!!!!!!!!!!!
' If OtprFile_temp <> 0 Then MsgBox OtprFile_temp
 OtprFile_temp = "<" + CStr(Outfile.Block) + ";" + CStr(Encode64Arr(data())) + ">"
 OtprFile_temp = Replace(OtprFile_temp, vbCrLf, "")
 Label5.Caption = Label5.Caption + Len(OtprFile_temp)
 MSComm1.Output = OtprFile_temp
 'crc
 Outfile.DoProverki = Outfile.DoProverki - 1
 Outfile.CalculateBytes = Outfile.CalculateBytes + CalculateBytes(data())
 Outfile.Block = Outfile.Block + 1
 FileSend.Label17.Caption = Outfile.Block
 ;DoEvents '''''''''''''''''''''''
 If Outfile.DoProverki = 0 Then
  MSComm1.Output = "#"
  DoEvents ''''''''''''''''''''''''''''''''''
  If Len(WaitForAnswer(1, CStr(Outfile.CalculateBytes))) <> 0 Then
   SetMeter (Seek(1) - 1) \ (Outfile.Size \ 100), FileSend
   Outfile.CalculateBytes = 0
   Outfile.DoProverki = Outfile.BlockPeredProverkoj
  'If SeekPos = OutFile.Size Then MSComm1.Output = "[OUT_OK]"
  Else
   FileSend.Label19.Caption = FileSend.Label19.Caption + 1
   Outfile.Block = Outfile.Block - Outfile.BlockPeredProverkoj
  End If
 End If
Loop

If Outfile.Size <= Seek(1) - 1 Then
 FileSend.Visible = False
 Sysmes "Успешно закачан", 0, True, True, Text2
 Close #1
 Exit Sub
End If
If Otp_Cancel = True Then
 Close #1
 Exit Sub
End If

OtprFile_temp = Outfile.Size - Loc(1)

ReDim data(0 To OtprFile_temp - 1)
GoTo OtpData_k:
Exit Sub
If Len(Err.Description) <> 0 Then
 MsgBox Err.Description, vbCritical, "Ошибка в SendFile"
 Err.Clear
 Close #1
End If
Exit Sub
exit1:
Exit Sub
End Sub

 Это кусок из моей терминалки... Старенькой... Щас как-раз новый алгоритьм придумываююю Ты этот почити а если чего не хватит... Ну там какой функции... Пиши на мыло...

Ответить

Номер ответа: 3
Автор ответа:
 Mace [F.T.L.]



ICQ: 265477716 

Вопросов: 0
Ответов: 11
 Профиль | | #3 Добавлено: 19.12.03 22:45

Проблема пересылки через ком не в том что файл надо разбить, а в том, что в отправляемой инфе не должно быть VBCRLF или там всяких Ат-команд... Надеюсь понимешь о чём я... Для этого я сначала использовал Base64-кодирование... Но размер увеличивается... Так что я теперь делаю интереснее... Я сначала файл режу... Потом блок данныйх сжимаю... Ну зипом например... И проверяю его на наличие этих всяких символов... Если нет то отправляю... Если есть то блок делишь ровно по этому символу... И получается что его нет... отправляешь первую часть... Потом проверяешь вторую... И так далее... Думаю понял... Надеюсь...

По повыду разбивки файла - это очень просто... Есть несколько способов... Ну например...

BlockSize - размер блока

Data() - Здесь у тебя будет инфа

i - счётчик номера блока

open "Твой файл" for input as #1

do while loc(1)-filelen("Твой файл")<blocksize

i=i+1

Redim preserve data(i)

data(i)=input(blocksize,#1)

loop

'У нас осталось данных меньше чем размер блока...

'Ну тут надо взять посчитать остаток и считать его...

'Сам посчитать сможешь я думаю...

Таким образом у тебя файл будет разбит по массиву... Это просто пример... Потом берёшь и записываешь в файл весь массив по очереди...

Типа -

for i=1 to i

put #1,,data(i)

next i ' примерно так - можно конечно получше...

Да кстати - CompressByteArray из моего примера это сжатие зипом если код или библиотека нужна - спрашивай... А Encode64() это Base64-кодирование...

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам