|
Option Explicit |
|
|
|
Const modeSplit = 1 |
|
Const modeCombine = 2 |
|
|
|
Const adTypeBinary = 1 |
|
|
|
Dim fso, adostreamin, adostreamout |
|
Dim FileIn, FileOut, Mode, PartCount, PartSize |
|
|
|
On Error Resume Next |
|
Set fso = CreateObject("Scripting.FileSystemObject") |
|
Set adostreamin = CreateObject("ADODB.Stream") |
|
Set adostreamout = CreateObject("ADODB.Stream") |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot create COM objects.") |
|
WScript.Quit 1 |
|
End If |
|
On Error GoTo 0 |
|
If WScript.Arguments.Named.Exists("?") Then |
|
WScript.StdOut.Write("Split file or combine files" & vbNewLine & _ |
|
vbNewLine & _ |
|
"Syntax: FileSplitter /s|/c [/pc:count|/ps:size] FileNameIn [FileNameOut]" & vbNewLine & _ |
|
vbNewLine & _ |
|
"/s Split file" & vbNewLine & _ |
|
"/c Combine files" & vbNewLine & _ |
|
"/pc Set the count of parts of splitted files" & vbNewLine & _ |
|
"/ps Set the size in bytes of each part of splitted file" & vbNewLine & _ |
|
vbNewLine & _ |
|
"When splitting file, the splitted files are stored in folder ""FileNameIn.Splitted""" & vbnewline & _ |
|
"(without FileNameOut) or in folder ""FileNameOut"" (with FileNameOut) and named ""FileNameIn.1""," & vbNewLine & _ |
|
"""FileNameIn.2"" ..." & vbnewline & _ |
|
"(without FileNameOut) or ""FileNameOut.1"", ""FileNameOut.2"" ... (with FileNameOut)." & vbNewLine & _ |
|
"When combining files, ""FileNameIn.1"", ""FileNameIn.2"" ... would be combined into ""FileNameIn""" & vbNewLine & _ |
|
"(without FileNameOut) or ""FileNameOut"" (with FileNameOut) and stored in the same folder as" & vbNewLine & _ |
|
"""FileNameIn.1"", ""FileNameIn.2"" ..." & vbNewLine & _ |
|
vbNewLine & _ |
|
"Note:" & vbNewLine & _ |
|
"FileNameIn can optionally include path but FileNameOut Cannot." & vbNewLine & _ |
|
"Size can be optionally suffixed with K(KB) or M(MB)." & vbNewLine & _ |
|
"/s is not compatible with /c." & vbNewLine & _ |
|
"/pc is not compatible with /ps." & vbNewLine & _ |
|
"/pc or /ps must be used with /s." & vbNewLine) |
|
WScript.Quit 0 |
|
End If |
|
If WScript.Arguments.Named.Exists("s") And WScript.Arguments.Named.Exists("c") Then |
|
WScript.StdErr.WriteLine("Conflict switches /s and /c.") |
|
WScript.Quit 1 |
|
ElseIf Not WScript.Arguments.Named.Exists("s") And Not WScript.Arguments.Named.Exists("c") Then |
|
WScript.StdErr.WriteLine("Missing switch /s or /c.") |
|
WScript.Quit 1 |
|
Else |
|
If WScript.Arguments.Named.Exists("s") Then |
|
If WScript.Arguments.Named.Exists("pc") And WScript.Arguments.Named.Exists("ps") Then |
|
WScript.StdErr.WriteLine("Conflit switches /pc and /ps.") |
|
WScript.Quit 1 |
|
ElseIf Not WScript.Arguments.Named.Exists("pc") And Not WScript.Arguments.Named.Exists("ps") Then |
|
WScript.StdErr.WriteLine("Missing switches /pc or /ps.") |
|
WScript.Quit 1 |
|
End If |
|
Mode = modeSplit |
|
If WScript.Arguments.Named.Exists("pc") Then |
|
PartCount = CLng(WScript.Arguments.Named("pc")) |
|
ElseIf WScript.Arguments.Named.Exists("ps") Then |
|
PartSize = WScript.Arguments.Named("ps") |
|
Select Case Mid(PartSize, Len(PartSize), 1) |
|
Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" |
|
On Error Resume Next |
|
PartSize = CLng(PartSize) |
|
If err.number <> 0 Then |
|
WScript.StdErr.Write("Invalid parameter size") |
|
WScript.Quit 1 |
|
End If |
|
On Error GoTo 0 |
|
If PartSize <= 0 Then |
|
WScript.StdErr.WriteLine("Invalid parameter size.") |
|
WScript.Quit 1 |
|
End If |
|
Case "k", "K" |
|
PartSize = CLng(Mid(PartSize, 1, Len(PartSize) - 1)) * 1024 |
|
Case "m", "M" |
|
PartSize = CLng(Mid(PartSize, 1, Len(PartSize) - 1)) * 1048576 |
|
Case Else |
|
WScript.StdErr.WriteLine("Invalid parameter size.") |
|
WScript.Quit 1 |
|
End Select |
|
Else |
|
WScript.StdErr.Write("Missing switch /pc or /ps.") |
|
WScript.Quit 1 |
|
End If |
|
ElseIf WScript.Arguments.Named.Exists("c") Then |
|
Mode = modeCombine |
|
End If |
|
End If |
|
If WScript.Arguments.Unnamed.Count = 0 Then |
|
WScript.StdErr.WriteLine("Missing parameter FileNameIn.") |
|
WScript.Quit 1 |
|
ElseIf WScript.Arguments.Unnamed.Count = 1 Then |
|
FileIn = WScript.Arguments.Unnamed(0) |
|
Else |
|
FileIn = WScript.Arguments.Unnamed(0) |
|
FileOut = WScript.Arguments.Unnamed(1) |
|
If fso.GetParentFolderName(FileOut) <> "" Then |
|
WScript.StdErr.WriteLine("Cannot specify path to parameter FileNameOut.") |
|
WScript.Quit 1 |
|
End If |
|
End If |
|
|
|
Dim PartSizePrev, FileOutDir, Count |
|
Select Case Mode |
|
Case modeSplit |
|
FileOutDir = fso.GetParentFolderName(FileIn) |
|
If IsEmpty(FileOut) Then |
|
FileOutDir = fso.BuildPath(fso.GetParentFolderName(FileIn), fso.GetFileName(FileIn) & ".Splitted") |
|
FileOut = fso.BuildPath(FileOutDir, FileIn & ".") |
|
Else |
|
FileOutDir = fso.BuildPath(fso.GetParentFolderName(FileIn), FileOut) |
|
FileOut = fso.BuildPath(FileOutDir, FileOut & ".") |
|
End If |
|
On Error Resume Next |
|
If Not fso.FolderExists(FileOutDir) Then |
|
fso.CreateFolder(FileOutDir) |
|
End If |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot create folder """ & FileOutDir & """.") |
|
WScript.Quit 1 |
|
End If |
|
adostreamin.Open |
|
adostreamin.Type = adTypeBinary |
|
adostreamout.Open |
|
adostreamout.Type = adTypeBinary |
|
adostreamin.LoadFromFile FileIn |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot open file """ & FileIn & """.") |
|
WScript.Quit 1 |
|
End If |
|
Count = 1 |
|
PartSizePrev = 0 |
|
If IsEmpty(PartSize) Then |
|
Do Until adostreamin.EOS |
|
PartSize = CLng(adostreamin.Size / PartCount * Count) |
|
adostreamin.CopyTo adostreamout, PartSize - PartSizePrev |
|
adostreamout.SaveToFile FileOut & Count |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot open file """ & FileOut & Count & """.") |
|
WScript.Quit 1 |
|
End If |
|
adostreamout.Position = 0 |
|
adostreamout.SetEOS |
|
PartSizePrev = PartSize |
|
Count = Count + 1 |
|
Loop |
|
ElseIf IsEmpty(PartCount) Then |
|
Do Until adostreamin.EOS |
|
adostreamin.CopyTo adostreamout, PartSize |
|
adostreamout.SaveToFile FileOut & Count |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot open file """ & FileOut & Count & """.") |
|
WScript.Quit 1 |
|
End If |
|
adostreamout.Position = 0 |
|
adostreamout.SetEOS |
|
Count = Count + 1 |
|
Loop |
|
End If |
|
On Error GoTo 0 |
|
adostreamin.Close |
|
adostreamout.Close |
|
WScript.StdOut.WriteLine("""" & FileIn & """ was splitted into """ & FileOut & "Xs"".") |
|
Case modeCombine |
|
adostreamin.Open |
|
adostreamin.Type = adTypeBinary |
|
adostreamout.Open |
|
adostreamout.Type = adTypeBinary |
|
Count = 1 |
|
On Error Resume Next |
|
Do |
|
If fso.FileExists(FileIn & "." & Count) Then |
|
adostreamin.LoadFromFile FileIn & "." & Count |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot open file """ & FileIn & "." & Count & """.") |
|
WScript.Quit 1 |
|
End If |
|
adostreamin.CopyTo adostreamout |
|
Else |
|
Exit Do |
|
End If |
|
Count = Count + 1 |
|
Loop While True |
|
If IsEmpty(FileOut) Then |
|
FileOut = FileIn |
|
Else |
|
FileOut = fso.BuildPath(fso.GetParentFolderName(FileIn), FileOut) |
|
End If |
|
adostreamout.SaveToFile FileOut |
|
If err.number <> 0 Then |
|
WScript.StdErr.WriteLine("Cannot open file """ & FileOut & """.") |
|
WScript.Quit 1 |
|
End If |
|
On Error GoTo 0 |
|
WScript.StdOut.WriteLine("""" & FileIn & ".Xs"" were combined into """ & FileOut & """.") |
|
End Select |