You should release resources acquired on exceptions, here you leave a file 
handle hanging. I'm pretty sure the error you get is related to that. Reworked 
code which should properly cleanup after itself
    
    
    proc encryptFile(key, key_hash, input_file, output_file: string) =
      #var buf: seq[uint8]
      
      echo input_file
      echo output_file
      var bufSize: int = 1000
      var source = newFileStream(input_file, fmRead)
      var dest = newFileStream(output_file, fmWrite)
      
      try:
        dest.write(key_hash)
        # encrypt 1st mb
        #var buf_enc: seq[uint8] = @[]
        var bytes_temp = source.readStr(1000000)
        var bytes_enc = crypto_secretbox_easy(key, bytes_temp)
        dest.write(bytes_enc)
        # var iters = 1
        # while source.atEnd == false or iters <= 1000:
        #   var bytes_temp = source.readStr(1000)
        #   dest.write(crypto_secretbox_easy(key, bytes_temp))
        #   iters = iters + 1
        # copy the rest
        #var buf: seq[uint8] = @[]
        var buf: seq[uint8] = @[]
        buf.setLen(bufSize)
        while source.atEnd == false:
          var bytes = source.readData(buf[0].addr, bufSize)
          if bytes == 0:
            break
          dest.writeData(buf[0].addr, bytes)
      
      except:
        echo "Unknown exception!"
      
      finally: # Always release resources
        source.close
        dest.close
    
    
    Run

Reply via email to