/splitfile

By QuickStep on Aug 19, 2006

;
; /splitfile [-bdfor] [OutputDir] <N> <file>
;
; /splitfile splits a file into multiple parts of N bytes.
; Usefull for example if you want to send large files over e-mail, but there is a
; size limit. The script automatically generates a .bat file which puts the files
; back together.
;
; CAUTION!: N size is in bytes! If you specify a very small amount the script will
;           generate a lot (ten-thousands) of files which may crash / seriously slow-
;           down your computer. The script leaves it in the users hands to decide how
;           many files there will be created and doesn't check for this.
;
;
; If you specify the -b switch, no batch file will be created
;
; If you specify the -d switch, you can change the output directory to something
; else in stead of the same directory the original file is in (Use quotes if the output
; dir contains spaces)
;
; If you specify the -f switch, the first N parameter will be the amount
; of files the original file will be split in, in stead of the amount of bytes
; for each file.
;
; If you specify the -o switch, all files that already exists will be overwritten,
; else an error message will occur.
;
; If you specify the -r switch, the original file will be removed
;
;
; /splitfile [-bdfor] [OutputDir] <N> <file>
;
; /splitfile splits a file into multiple parts of N bytes.
; Usefull for example if you want to send large files over e-mail, but there is a
; size limit. The script automatically generates a .bat file which puts the files
; back together.
;
; CAUTION!: N size is in bytes! If you specify a very small amount the script will
;           generate a lot (ten-thousands) of files which may crash / seriously slow-
;           down your computer. The script leaves it in the users hands to decide how
;           many files there will be created and doesn't check for this.
;
;
; If you specify the -b switch, no batch file will be created
;
; If you specify the -d switch, you can change the output directory to something
; else in stead of the same directory the original file is in (Use quotes if the output
; dir contains spaces)
;
; If you specify the -f switch, the first N parameter will be the amount
; of files the original file will be split in, in stead of the amount of bytes
; for each file.
;
; If you specify the -o switch, all files that already exists will be overwritten,
; else an error message will occur.
;
; If you specify the -r switch, the original file will be removed
;

alias splitfile {
  ; Version check
  ; ---
  if ($version < 6.17) splitfile_error Your version is too low, please upgrade to 6.17+

  ; Check optional switch
  ; ---
  var %switch
  if (-* iswm $1) {
    %switch = $1
    tokenize 32 $2-
  }

  ; Check Output directory
  ; ---
  var %outputdir = $nofile($2-)
  if (d isincs %switch) {
    %outputdir = $iif(*\ iswm $iif($noqt($1) == $1,$1,$gettok($1-,1,34)),$v2,$+($v2,\))
    tokenize 32 $gettok($2-,$+($numtok(%outputdir,32),-),32)
  }

  ; Set variables
  ; ---
  var &data, %file = $qt($2-), %size = $iif(f isincs %switch,$ceil($calc($file(%file) / $1)),$1), $&
    %parts = $int($calc($file(%file) / %size)), %batfile = $qt($+(%outputdir,$nopath($+($2-,.bat)))), $&
    %partfile, %bfile, %n = 0

  ; Extra error checking
  ; ---
  if ($1 <= 0) splitfile_error $1 $+ : Invalid parameter
  if (!%parts) splitfile_error No need to split the file!
  if ($exists(%batfile)) {
    if (o isincs %switch) .remove %batfile
    else splitfile_error %batfile already exists.
  }

  ; Binary read & write loop
  ; ---
  while (%n <= %parts) {

    %partfile = $nopath($+($2-,.,p,$base(%n,10,10,3)))
    %bfile = $qt($+(%outputdir,%partfile))

    ; Read
    bread %file $calc(%n * %size) %size &data

    ; Check
    if ($exists(%bfile)) {
      if (o isincs %switch) .remove %bfile
      else splitfile_error %bfile already exists.
    }

    ; And write
    bwrite $qt($+(%outputdir,%partfile)) -1 -1 &data

    ; Batch file creation
    ; ---
    if ((b !isincs %switch) && (%n)) {
      write %batfile @ copy /b $qt($nopath($iif(%n = 1,$+($2-,.p000),%file))) + $qt(%partfile) $&
        $qt($nopath(%file)) >nul
    }
    inc %n
  }

  ; Optional remove original file
  ; ---
  if (r isincs %switch) .remove %file
  return

  ; Error Catching routine
  ; ---
  :error | tokenize 32 $error
  splitfile_error $3-

}

alias -l splitfile_error {
  ; Error output
  ; ---
  echo $color(info) -eg * /splitfile: $$1-
  halt
}

Comments

Sign in to comment.
Staccia   -  Feb 01, 2007

what exactly does this do....

 Respond  
Pariah   -  Aug 20, 2006

Very nice job, QuickStep. I\'d never even thought of doing anything like this with mIRC.

 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.