|
07.02.2005, 10:06:41
#32903454
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
Участник
Сообщения: 3 020
Рейтинг:
0
/ 0
|
|
|
|
на суд публики выкладываю набор процедур
для порезки непролезающих в почту файлов
(у кого нет RAR - знают, о чем речь)
маленькое пояснение:
контроль CRC ессно не реализован, поэтому лучше всего резать ZIP - он при распаковке проверит целостность
код работает под EXCEL,
но можно и Word, и Access, и VB задействовать,
поскольку специфики нет, все стандартно
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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195.
Const myExt = "slc" 'расширение у файлов
Const SlicePart = 1048576 * 2 'размер куска
'Декларируем:
Public Type OpenFilename
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
Flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" _
(ByRef pOpenfilename As OpenFilename) As Boolean
Declare Function CommDlgExtendedError Lib "comdlg32.dll" () As Long
'Аргументы: sTitle - строка которую выводим в заголовке формы открытия файла
'Назначение: Вывод диалогового окна открытия файла
'Возвращает: Строку - путь к выбранному файлу
Public Function GetFile(Optional sFlt As String = "", Optional sTitle As String = "Открыть файл") As String
Dim of As OpenFilename
Dim pos As Integer
GetFile = ""
of.lStructSize = Len(of)
'of.hwndOwner = Application.hWndExcelApp
If sFlt = "" Then sFlt = "ZIP Files (*.zip)" & Chr$( 0 ) & "*.zip"
of.lpstrFilter = sFlt ' "ZIP Files (*.zip)" & Chr$(0) & "*.zip" & Chr$(0) & "All Files (*.*)" & Chr$(0) & "*.*"
of.nFilterIndex = 1
of.lpstrFile = String$( 512 , 0 )
of.nMaxFile = 511
of.lpstrDefExt = "mdb"
of.lpstrTitle = sTitle
If GetOpenFileName(of) Then
pos = InStr( 1 , of.lpstrFile, Chr$( 0 ))
GetFile = Left(of.lpstrFile, pos - 1 )
End If
End Function
Sub Slice()
Dim sFileIn, sFileOut, lngFileLen, LastSliceLen, j, MaxJ
Dim VarString As String
Dim a, b, c
On Error GoTo err_slice
sFileIn = GetFile()
If sFileIn = "" Then Exit Sub
DivideFileName sFileIn, a, b, c
sFileOut = ActiveWorkbook.Path & "\" & b & "."
On Error Resume Next
Kill sFileOut & "*"
On Error GoTo err_slice
VarString = String(SlicePart, " ")
Open sFileIn For Binary Access Read As 1
lngFileLen = LOF( 1 )
MaxJ = lngFileLen \ SlicePart
LastSliceLen = lngFileLen Mod SlicePart
For j = 1 To MaxJ
Open sFileOut & CalcExt(j) For Binary Access Write As 2
Get # 1 , , VarString
Put # 2 , , VarString
Close 2
Next
'last part
If LastSliceLen > 0 Then
VarString = String(LastSliceLen, " ")
Open sFileOut & CalcExt(MaxJ + 1 ) For Binary Access Write As 2
Get # 1 , , VarString
Put # 2 , , VarString
Close 2
End If
ext_slice:
Close 2
Close 1
Exit Sub
err_slice:
MsgBox "ERROR: " & Err.Number & Err.Description & vbCrLf & "Terminating execution.", vbCritical, "ERROR!"
Resume ext_slice
End Sub
Function CalcExt(PartNo)
'выдать расширение
If PartNo = 1 Then
CalcExt = myExt
Else
CalcExt = Left(myExt, 1 ) + Format(PartNo - 1 , "00")
End If
End Function
Sub UnSlice()
Dim sFileIn, curFileIn, sFileOut, lngFileLen, LastSliceLen, j, MaxJ
Dim VarString As String
Dim a, b, c
On Error GoTo err_slice
sFileIn = GetFile("SLICED Files (*.slc)" & Chr$( 0 ) & "*.slc")
If sFileIn = "" Then Exit Sub
DivideFileName sFileIn, a, b, c
sFileIn = a & b & "."
sFileOut = ActiveWorkbook.Path & "\" & b & ".zip"
'Kill sFileOut & "*"
Open sFileOut For Binary Access Write As 2
Do
j = j + 1
curFileIn = sFileIn & CalcExt(j)
If Dir(curFileIn) <> "" Then 'это еще не конец
Open curFileIn For Binary Access Read As 1
lngFileLen = LOF( 1 )
VarString = String(lngFileLen, " ")
Get # 1 , , VarString
Put # 2 , , VarString
Close 1
Debug.Print curFileIn & " OK"
Else
Exit Do
End If
Loop
ext_slice:
Close 2
Close 1
Exit Sub
err_slice:
MsgBox "ERROR: " & Err.Number & Err.Description & vbCrLf & "Terminating execution.", vbCritical, "ERROR!"
Resume ext_slice
End Sub
Sub DivideFileName(sIn, sDir, sFile, sExt)
Dim tmp, j
'получить путь со слэшем
tmp = sIn
For j = Len(tmp) To 3 Step - 1
If Mid(tmp, j, 1 ) = "\" Then Exit For
Next
sDir = Left(tmp, j)
'получить расширение, на входе имя файла
tmp = Right(sIn, Len(sIn) - Len(sDir))
For j = Len(tmp) To 3 Step - 1
If Mid(tmp, j, 1 ) = "." Then Exit For
Next
sExt = Right(tmp, Len(tmp) - j)
'имя файла
sFile = Left(tmp, Len(tmp) - Len(sExt) - 1 )
End Sub
Sub testDiv(sPath)
Dim a, b, c
DivideFileName sPath, a, b, c
Debug.Print "D=" & a
Debug.Print "F=" & b
Debug.Print "E=" & c
End Sub
|
|
|