1 (изменено: Poltergeyst, 2010-07-10 20:03:04)

Тема: 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>