github.com/wangyougui/gf/v2@v2.6.5/os/gfile/gfile_size.go (about)

     1  // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
     2  //
     3  // This Source Code Form is subject to the terms of the MIT License.
     4  // If a copy of the MIT was not distributed with this file,
     5  // You can obtain one at https://github.com/wangyougui/gf.
     6  
     7  package gfile
     8  
     9  import (
    10  	"fmt"
    11  	"os"
    12  	"strconv"
    13  	"strings"
    14  )
    15  
    16  // Size returns the size of file specified by `path` in byte.
    17  func Size(path string) int64 {
    18  	s, e := os.Stat(path)
    19  	if e != nil {
    20  		return 0
    21  	}
    22  	return s.Size()
    23  }
    24  
    25  // SizeFormat returns the size of file specified by `path` in format string.
    26  func SizeFormat(path string) string {
    27  	return FormatSize(Size(path))
    28  }
    29  
    30  // ReadableSize formats size of file given by `path`, for more human readable.
    31  func ReadableSize(path string) string {
    32  	return FormatSize(Size(path))
    33  }
    34  
    35  // StrToSize converts formatted size string to its size in bytes.
    36  func StrToSize(sizeStr string) int64 {
    37  	i := 0
    38  	for ; i < len(sizeStr); i++ {
    39  		if sizeStr[i] == '.' || (sizeStr[i] >= '0' && sizeStr[i] <= '9') {
    40  			continue
    41  		} else {
    42  			break
    43  		}
    44  	}
    45  	var (
    46  		unit      = sizeStr[i:]
    47  		number, _ = strconv.ParseFloat(sizeStr[:i], 64)
    48  	)
    49  	if unit == "" {
    50  		return int64(number)
    51  	}
    52  	switch strings.ToLower(unit) {
    53  	case "b", "bytes":
    54  		return int64(number)
    55  	case "k", "kb", "ki", "kib", "kilobyte":
    56  		return int64(number * 1024)
    57  	case "m", "mb", "mi", "mib", "mebibyte":
    58  		return int64(number * 1024 * 1024)
    59  	case "g", "gb", "gi", "gib", "gigabyte":
    60  		return int64(number * 1024 * 1024 * 1024)
    61  	case "t", "tb", "ti", "tib", "terabyte":
    62  		return int64(number * 1024 * 1024 * 1024 * 1024)
    63  	case "p", "pb", "pi", "pib", "petabyte":
    64  		return int64(number * 1024 * 1024 * 1024 * 1024 * 1024)
    65  	case "e", "eb", "ei", "eib", "exabyte":
    66  		return int64(number * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)
    67  	case "z", "zb", "zi", "zib", "zettabyte":
    68  		return int64(number * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)
    69  	case "y", "yb", "yi", "yib", "yottabyte":
    70  		return int64(number * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)
    71  	case "bb", "brontobyte":
    72  		return int64(number * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024)
    73  	}
    74  	return -1
    75  }
    76  
    77  // FormatSize formats size `raw` for more manually readable.
    78  func FormatSize(raw int64) string {
    79  	var r float64 = float64(raw)
    80  	var t float64 = 1024
    81  	var d float64 = 1
    82  	if r < t {
    83  		return fmt.Sprintf("%.2fB", r/d)
    84  	}
    85  	d *= 1024
    86  	t *= 1024
    87  	if r < t {
    88  		return fmt.Sprintf("%.2fK", r/d)
    89  	}
    90  	d *= 1024
    91  	t *= 1024
    92  	if r < t {
    93  		return fmt.Sprintf("%.2fM", r/d)
    94  	}
    95  	d *= 1024
    96  	t *= 1024
    97  	if r < t {
    98  		return fmt.Sprintf("%.2fG", r/d)
    99  	}
   100  	d *= 1024
   101  	t *= 1024
   102  	if r < t {
   103  		return fmt.Sprintf("%.2fT", r/d)
   104  	}
   105  	d *= 1024
   106  	t *= 1024
   107  	if r < t {
   108  		return fmt.Sprintf("%.2fP", r/d)
   109  	}
   110  	d *= 1024
   111  	t *= 1024
   112  	if r < t {
   113  		return fmt.Sprintf("%.2fE", r/d)
   114  	}
   115  	d *= 1024
   116  	t *= 1024
   117  	if r < t {
   118  		return fmt.Sprintf("%.2fZ", r/d)
   119  	}
   120  	d *= 1024
   121  	t *= 1024
   122  	if r < t {
   123  		return fmt.Sprintf("%.2fY", r/d)
   124  	}
   125  	d *= 1024
   126  	t *= 1024
   127  	if r < t {
   128  		return fmt.Sprintf("%.2fBB", r/d)
   129  	}
   130  	return "TooLarge"
   131  }