go获取文件大小

在写go语言获取文件大小前,先复习下c语言获取文件大小的方法,不再重复造轮子,直接ctrl v前辈一个:

原优质博文地址:http://blog.csdn.net/yutianzuijin/article/details/27205121

C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小。Java中File类有个length函数,Python中os.path包中有个getsize函数,C语言中却没有直接对应的函数获取文件大小。

       目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下:

  1. int file_size(char* filename)  
  2. {  
  3.     FILE *fp=fopen(filename,"r");  
  4.     if(!fp) return -1;  
  5.     fseek(fp,0L,SEEK_END);  
  6.     int size=ftell(fp);  
  7.     fclose(fp);  
  8.       
  9.     return size;  
  10. }  

上述方法利用fseek移动一个文件的存取位置到文件的末尾,然后利用ftell获得目前的文件访问位置。这种方法可以认为是一种间接的获取方式。虽说可以获得文件大小,但是有两个缺点。首先,ftell的返回值为long,在不同环境下占用的字节数也不同,这就可能存在long是四个字节的情况。此时,获取的文件大小就不能超过2G,否则就会出错。

但是,上述缺点在大多数情况下都没问题,超大文件还可以通过fsetpos和fgetpos获取文件大小。最致命的缺陷就是它需要加载文件到内存,然后跳转到文件末尾,这个操作非常耗时!可能在读取少量文件时体现不出,但是当文件达到上万个时,速度就会慢的要命,这种方法相当于把所有的文件都读到内存中一遍!

如果可能,尽量避免采用上述间接的方式获取文件大小。在linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,速度也快很多。代码如下:

  1. #include <sys/stat.h>  
  2. int file_size2(char* filename)  
  3. {  
  4.     struct stat statbuf;  
  5.     stat(filename,&statbuf);  
  6.     int size=statbuf.st_size;  
  7.   
  8.     return size;  
  9. }  

这种方式首先获得相关文件的状态信息,然后从状态信息中读取大小信息。由于没有读取文件的操作,所以操作速度非常快。强烈建议大家在linux下使用这种方式。Windows平台下肯定也有类似的函数读取文件信息,不过本人常年不在windows下编程,所以在此不做介绍。

对比c语言,go语言获取文件大小,用seek()

package main

import (
	"fmt"
	"os"
)

func main() {

	//打开本地文件 读取出全部数据
	fin, err := os.Open("args.go")
	defer fin.Close()
	if err != nil {
		return
	}
	fmt.Println(fin.Seek(0, os.SEEK_END))

	//文件指针指向文件末尾 获取文件大小保存于buf_len
	buf_len, _ := fin.Seek(0, os.SEEK_END)
	fmt.Println("buf_len", buf_len)
	//获取buf_len后把文件指针重新定位于文件开始
	fin.Seek(0, os.SEEK_SET)

	buf := make([]byte, buf_len)
	fin.Read(buf)
	fmt.Println(string(buf[:]), len(buf))

}
至于go的其他方法实现获取指定名字的文件的大小,还在摸索中。。。

C语言是一种比较底层的语言,有时在其他语言中很容易操作的事情,在C语言中就比较麻烦,例如获取一个文件的大小。Java中File类有个length函数,Python中os.path包中有个getsize函数,C语言中却没有直接对应的函数获取文件大小。

       目前,网上有一种流传很广的方法,读取文件到内存,然后跳转到文件末尾,查看跳转的长度。代码如下:

  1. int file_size(char* filename)  
  2. {  
  3.     FILE *fp=fopen(filename,"r");  
  4.     if(!fp) return -1;  
  5.     fseek(fp,0L,SEEK_END);  
  6.     int size=ftell(fp);  
  7.     fclose(fp);  
  8.       
  9.     return size;  
  10. }  

上述方法利用fseek移动一个文件的存取位置到文件的末尾,然后利用ftell获得目前的文件访问位置。这种方法可以认为是一种间接的获取方式。虽说可以获得文件大小,但是有两个缺点。首先,ftell的返回值为long,在不同环境下占用的字节数也不同,这就可能存在long是四个字节的情况。此时,获取的文件大小就不能超过2G,否则就会出错。

但是,上述缺点在大多数情况下都没问题,超大文件还可以通过fsetpos和fgetpos获取文件大小。最致命的缺陷就是它需要加载文件到内存,然后跳转到文件末尾,这个操作非常耗时!可能在读取少量文件时体现不出,但是当文件达到上万个时,速度就会慢的要命,这种方法相当于把所有的文件都读到内存中一遍!

如果可能,尽量避免采用上述间接的方式获取文件大小。在linux下,还有一种更简单的方式,通过读取文件信息获得文件大小,速度也快很多。代码如下:

  1. #include <sys/stat.h>  
  2. int file_size2(char* filename)  
  3. {  
  4.     struct stat statbuf;  
  5.     stat(filename,&statbuf);  
  6.     int size=statbuf.st_size;  
  7.   
  8.     return size;  
  9. }  

这种方式首先获得相关文件的状态信息,然后从状态信息中读取大小信息。由于没有读取文件的操作,所以操作速度非常快。强烈建议大家在linux下使用这种方式。Windows平台下肯定也有类似的函数读取文件信息,不过本人常年不在windows下编程,所以在此不做介绍。

猜你喜欢

转载自blog.csdn.net/qq_21794823/article/details/79028660
今日推荐