Linux 知识学习总结

常用命名

du

作用:显示指定目录或文件所占磁盘空间大小。
示例:

  • du -h
    以K,M,G为单位自动适配显示
lx@lx-virtual-machine:~/test/video$ du -h
1.2G	
  • du -m
    指定以1MB为单位显示
lx@lx-virtual-machine:~/test/video$ du -m
1214	
  • du -a
lx@lx-virtual-machine:~/test/video$ du -a
24	./word_1.docx
176	./pdf_1.pdf
117984	./video_8.mp4
117984	./video_9.mp4
176	./pdf_2.pdf
117984	./video_7.mp4
104084	./video_baduanjin_2.mp4
156	./pdf_3.pdf
117984	./video_4.mp4
104084	./video_baduanjin_3.mp4
104084	./video_baduanjin_4.mp4
104084	./video_baduanjin_1.mp4
117984	./video_2.mp4
117980	./video_3.mp4
117984	./video_1.mp4
1242756	.

文件系统

文件属性结构 struct stat

函数原型

int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
  • 参数:
    path:文件路径;buf:struct stat的指针。
  • 返回值
    0:成功;
    EBADF:文件描述词无效
    EFAULT:地址空间不可访问
    ELOOP:遍历路径时遇到太多的符号连接
    ENAMETOOLONG:文件路径名太长
    ENOENT:路径名的部分组件不存在,或路径名是空字串
    ENOMEM:内存不足
    ENOTDIR:路径名的部分组件不是目录
  • 区别:
    stat:没有处理软链接的能力。如果文件是符号链接,也只能返回链接指向文件的属性;
    lstat:如果文件是符号链接,则返回符号链接的内容。
  • 结构体信息
struct stat {
	mode_t     st_mode;       //文件对应的模式,文件,目录等
    ino_t      st_ino;       //inode节点号
    dev_t      st_dev;        //设备号码
    dev_t      st_rdev;       //特殊设备号码
    nlink_t    st_nlink;      //文件的连接数
    uid_t      st_uid;        //文件所有者
    gid_t      st_gid;        //文件所有者对应的组
    off_t      st_size;       //普通文件,对应的文件字节数
    time_t     st_atime;      //文件最后被访问的时间
    time_t     st_mtime;      //文件内容最后被修改的时间
    time_t     st_ctime;      //文件状态改变时间
    blksize_t st_blksize;    //文件内容对应的块大小
    blkcnt_t   st_blocks;     //伟建内容对应的块数量
};

获取指定目录所占磁盘空间大小(C++代码实现)

实现方式:借助Linux du命名获取返回内容,并提取数据信息。
.hpp

#pragma once

#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

class FileProcess
{
public:
	FileProcess() {};
	~FileProcess() {};
	
	uint64_t getDirectorySize(string path)
	{
		string cmd;
		cmd = "du -m " + path;

		FILE* fp = NULL;
		char result[1024] = { 0 };
		char buf[1024] = { 0 };

		if ((fp = popen(cmd.c_str(), "r")) == NULL) {
			printf("popen error!\n");
			return -1;
		}

		while (fgets(buf, sizeof(buf), fp)) {
			strcat(result, buf);
		}

		pclose(fp);
		printf("result: %s\n", result);
		return (uint64_t)atol(string(result).substr(0, string(result).find(' ')).c_str());
	}
	
private:

};

.cpp

void custom_file_process_task()
{
	FileProcess fileProcess;
	string path = "/home/lx/test/video";

	while (1)
	{
		cout << "i am custom_file_process_task" << endl;
		
		uint64_t size = fileProcess.getDirectorySize(path);
		cout << "size: " << size << endl;

		sleep(5);
	}
}

测试结果
在这里插入图片描述

你可能感兴趣的:(Linux,linux)