Тема: LangMF 8.0: разбиение файла на фрагменты (File split)
Без гарантий. Используете на свой страх и риск.
Скрипт предназначен для разбиения заданного файла на фрагменты установленного размера а также для его восстановления. Для размещения фрагментов создается каталог с именем изначального файла.
Для разбиения файла перетащите его значок на кнопку "Разбить Файл" методом Drag & Drop или нажмите эту кнопку, чтобы выбрать файл для деления.
Для восстановления файла перетащите значок каталога с фрагментами на кнопку "Собрать Файл" методом Drag & Drop или нажмите эту кнопку,чтобы выбрать каталог.Также для сборки исходного файла можно использовать BAT расположенный в каталоге фрагментов.
Потребуется установленный LangMF 8.0.
'Разбиение файлов v1.1
'------------------------------------------------------------------------------------------------------
'Language LangMF 8.0
'OC Win98/ME
'------------------------------------------------------------------------------------------------------
'Скрипт предназначен для разбиения заданного файла на фрагменты установленного
'размера а также для его восстановления.Для размещения фрагментов создается
'каталог с именем изначального файла.
'Для разбиения файла перетащите его значок на кнопку "Разбить Файл" методом
'Drag & Drop или нажмите эту кнопку,чтобы выбрать файл для деления.
'Для восстановления файла перетащите значок каталога с фрагментами файла на кнопку
'"Собрать Файл" методом Drag & Drop или нажмите эту кнопку,чтобы выбрать каталог с
'фрагментами.Также для сборки исходного файла можно использовать BAT расположенный
'в каталоге фрагментов.
'------------------------------------------------------------------------------------------------------
<#Module=FileSplitter>
'------------------------------------------------------------------------------------------------------
Sub Load(cmdline)
With form1
.AutoRedraw =True
.BackColor =&H80FFFF
.Width =500*vbPx
.Height =210*vbPy
.Caption ="Разбиение файла v1.1"
.Style.ToolWindow =True
.Style.TaskBar =True
.Add "Command",1, "Width=150","Height=30", _
"Top=10","Left=10","Caption=Разбить Файл","OLEDropMode=1"
.Add "Command",2, "Width=150","Height=30", _
"Top=50","Left=10","Caption=Собрать Файл","OLEDropMode=1"
.Add "Label",1, "Width=150","Height=10", _
"Top=90","Left=10","Alignment=2","Caption=Размер фрагмента(Байт)"
.Add "MText",1, "Width=150","Height=20", _
"Top=120","Left=10","MultiLine=False","Text=1457152","MaxLength=11"
.Add "ProgressBar",1, "Width=480","Height=20", _
"Top=150","Left=10","BarBorder=1"
.Add "Label",2, "Width=300","Height=100", _
"Top=10","Left=170","Alignment=2","Caption=Готово.Выберите файл."
.Show
End With
End Sub
'//Разбиение файла на фрагменты//
'------------------------------------------------------------------------------------------------------
Function SplitFile(SourceFile)
'[Установка размера буфера,определение размера файла]
'----------------------------------------------------------------------------------------------
Dim buf
bufSize= CLng(Replace(form1.MText(1).Text,Chr(32),""))
buf= String(bufSize,vbNullChar)
Sys.File.FileOpen SourceFile,1,"binary"
Sys.cSleep(50)
Size=Sys.File.FileLOF(1)
Sys.cSleep(50)
If Size=0 Then
Sys.File.FileClose(1)
Exit Function
End If
'[Определение количества файлов и некоторых параметров]
'----------------------------------------------------------------------------------------------
FilesNum= Fix(CDbl(Size/bufSize))+1
SourceName= Sys.File.GetFName(SourceFile)
SourceExt= Sys.File.GetFSideR(SourceFile)
SplitName= Sys.File.GetFSideN(SourceFile)
SplitPath= Sys.File.GetFPath(SourceFile)
'[Запрос на подтверждение]
'----------------------------------------------------------------------------------------------
iAnsw=MsgBox( "Файл " & SourceName & " будет разбит на " & FilesNum & " частей." & vbCRLF & _
"Уверены,что хотите продолжить?", _
vbInformation+vbYesNo+vbSystemModal,"Разбиение файла")
If iAnsw=vbNo Then
Sys.File.FileClose(1)
Exit Function
End If
'[Установка параметров элементов управления]
'----------------------------------------------------------------------------------------------
form1.Command(1).Enabled =False
form1.Command(2).Enabled =False
form1.Label(2).Caption= "Исходный файл " & SourceName & vbCRLF & _
" разбивается на " & vbCRLF & FilesNum & " частей."
'[Создание каталога для файлов-фрагментов]
'/Имя каталога=пробел+имя файла - при восстановлении файла исходное имя определяется/
'/по имени каталога/
'----------------------------------------------------------------------------------------------
Dir= SplitPath & Chr(32) & SplitName & "." & SourceExt
Sys.File.MkDir2 Dir
'[Деление файла на фрагменты]
'----------------------------------------------------------------------------------------------
BatStr=""
i=1
While Not Sys.File.FileEOF(1)
'[Слежение за разницей текущей позиции чтения и размером исходного файла]
'[Если эта разница меньше изначального размера буфера,то размер буфера]
'[устанавливается принудительно]
'--------------------------------------------------------------------------------------
diff=CLng(Size-Sys.File.FileLOC(1))
If diff<bufSize Then buf=String(diff+1,vbNullChar)
'[Запись файла-фрагмента]
'--------------------------------------------------------------------------------------
Sys.File.FileOpen Dir & "\" & SplitName & "_" & i ,2,"binary"
Sys.File.FileGet 1,0,buf
Sys.cSleep(50)
Sys.File.FilePut 2,0,buf
Sys.File.FileClose(2)
'[Генерация командной строки для Bat файла восстановления]
'--------------------------------------------------------------------------------------
If i=2 Then _
BatStr=BatStr & _
"copy /b " & SplitName & "_" & i-1 & "+" & SplitName & "_" & i & " " & SourceName & vbCRLF
If i>2 Then _
BatStr=BatStr & _
"copy /b " & SourceName & "+" & SplitName & "_" & i & " " & SourceName & vbCRLF
'[Установка прогресса]
'--------------------------------------------------------------------------------------
form1.ProgressBar(1).BarProcent=Fix((i*100)/FilesNum)
DoEvents
i=i+1
Wend
Sys.File.FileClose(1)
'[Запись Bat файла восстановления]
'----------------------------------------------------------------------------------------------
Sys.cSleep(100)
Sys.Conv.Str2File BatStr,Dir & "\" & SplitName & ".BAT"
'[Установка параметров элементов управления]
'----------------------------------------------------------------------------------------------
Sys.cSleep(100)
form1.ProgressBar(1).BarProcent =0
form1.Command(1).Enabled =True
form1.Command(2).Enabled =True
form1.Label(2).Caption ="Готово.Выберите файл."
MsgBox "Готово",vbInformation+vbSystemModal,"Разбиение файла"
End Function
'//Объединение фрагментов в исходный файл//
'------------------------------------------------------------------------------------------------------
Function MergeFile(InitDir)
'[Имя исходного файла]
'----------------------------------------------------------------------------------------------
MaskToMerge=Sys.LTrimS(Sys.File.GetFName(InitDir))
'[Запрос на подтверждение]
'----------------------------------------------------------------------------------------------
iAnsw=MsgBox( "Уверены,что хотите восстановить файл " & MaskToMerge & "?", _
vbInformation+vbYesNo+vbSystemModal,"Разбиение файла")
If iAnsw=vbNo Then Exit Function
'[Установка параметров элементов управления]
'----------------------------------------------------------------------------------------------
form1.Command(1).Enabled =False
form1.Command(2).Enabled =False
form1.Label(2).Caption= "Восстановление файла " & MaskToMerge
'[Определение имени изначального файла по имени каталога и создание файла-болванки]
'----------------------------------------------------------------------------------------------
Name =Sys.LTrimS(Sys.File.GetFSideN(MaskToMerge))
Ext =Sys.File.GetFSideR(MaskToMerge)
Sys.File.FileOpen InitDir & "\" & Name & "." & Ext,1,"binary"
'[Восстановление файла]
'----------------------------------------------------------------------------------------------
Dim buf
i=1
Do
'[Проверка наличия фрагмента]
'--------------------------------------------------------------------------------------
If Sys.File.IsDirFile(InitDir & "\" & Name & "_" & i)=True Then
form1.Label(2).Caption= "Восстановление файла " & MaskToMerge & vbCRLF & _
"Фрагмент " & Name & "_" & i
DoEvents
Sys.File.FileOpen InitDir & "\" & Name & "_" & i,2,"binary"
Else
Exit Do
End If
'[Установка буфера в соответствии с размером фрагмента]
'[Запись фрагмента в файл болванку]
'--------------------------------------------------------------------------------------
buf=String(Sys.File.FileLOF(2),vbNullChar)
Sys.File.FileGet 2,0,buf
Sys.cSleep(50)
Sys.File.FilePut 1,0,buf
Sys.File.FileClose(2)
i=i+1
Loop
Sys.File.FileClose(1)
Sys.cSleep(100)
'[Установка параметров элементов управления]
'----------------------------------------------------------------------------------------------
Sys.cSleep(100)
form1.Command(1).Enabled =True
form1.Command(2).Enabled =True
form1.Label(2).Caption ="Готово.Выберите файл."
MsgBox "Готово.Проверьте правильность восстановленного файла.", _
vbInformation+vbSystemModal, _
"Восстановление файла"
End Function
<#Module>
'-------------------------------------------------------------------------------------------------------
<#Form=form1>
'-----------------------------------------------------------------------------------------------
Sub Form_Unload()
EndMf
End Sub
'-----------------------------------------------------------------------------------------------
Sub Command1_Click()
'[Выбор файла для деления на фрагменты]
'---------------------------------------------------------------------------------------
If CLng(Mid(lmf_Version,1,1) & Mid(lmf_Version,3,1))>=78 Then
SourceFile=Sys.CDlg.ShowOpen( "All Files|*.*", _
"Выберите файл для деления", _
Sys.Path,"*.*",form1.Hwnd,1+4096)
Else
SourceFile=Sys.CDlg.ShowOpen( "Выберите файл для деления", _
"All Files|*.*",Sys.Path, _
"*.*",form1.Hwnd,1+4096)
End If
If SourceFile<>"" Then SplitFile(SourceFile)
'---------------------------------------------------------------------------------------
End Sub
'-----------------------------------------------------------------------------------------------
Sub Command2_Click()
'[Выбор каталога содержащего фрагменты]
'---------------------------------------------------------------------------------------
InitDir=Sys.CDlg.ShowFolder ("Выберите каталог с фрагментами файла:",form1.Hwnd)
If InitDir<>"" Then MergeFile(InitDir)
End Sub
'-----------------------------------------------------------------------------------------------
Sub Command1_OLEDragDrop(Data,Effect,Button,Shift,X,Y)
With Data.Files
If .Count=1 Then SplitFile(.Item(1))
End With
End Sub
'-----------------------------------------------------------------------------------------------
Sub Command2_OLEDragDrop(Data,Effect,Button,Shift,X,Y)
With Data.Files
If .Count=1 Then MergeFile(.Item(1))
End With
End Sub
'-----------------------------------------------------------------------------------------------
Sub MText1_Change()
With form1.MText(1)
If Len(.Text)>3 Then .Text=Sys.cFormat(.Text,"### ### ###")
.SelStart=Len(.Text)
End With
End Sub
'-----------------------------------------------------------------------------------------------
<#Form>