文件和目錄管理

文件和目錄管理

Linux下一切皆文件,目錄、軟鏈接和硬鏈接、設備等都可以視爲文件

索引號inode

inode在Linux中代表一個文件的索引節點,inode中存儲了一些文件的元信息

  • 文件字節數
  • 文件擁有者的User ID
  • 文件組的Group ID
  • 文件的讀寫權限
  • 文件的時間戳
  • 鏈接數
  • 文件數據block的位置

使用stat命令可以查看某個文件的inode信息

//終端輸入
stat filename

//例如:文件tiem.c的inode信息如下
  File: `time.c'
  Size: 128       	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 3545467     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-03-13 14:23:57.406913556 -0700
Modify: 2020-03-13 14:23:19.414915320 -0700
Change: 2020-03-13 14:23:48.838912714 -0700
 Birth: -

inode的大小

inode也會消耗硬盤空間,所以磁盤格式化的時候,操作系統會自動將硬盤分爲兩個區域:數據區和inode區

  • 數據區用於存放文件數據
  • inode區用於存放inode包含的信息

每個inode的節點的大小,一般是128字節或者256字節。inode節點的總數,在格式化的時候就給定,一般是每1KB或每2Kb就設置一個inode。如果每KB就設置一個inode,那麼inode table的大小就會達到128M,佔整塊硬盤的12.8%

如果需要獲取Linux的inode的大小,可以使用以下命令

dumpe2fs -h /dev/sda1 | grep "Inode size"

如果需要查看每個硬盤分區的inode的總數和使用情況,可以使用以下命令

df -i

stat查看文件詳細信息

stat函數組可以獲取文件的詳細信息

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

//stat結構體內容如下:
struct stat {
      dev_t     st_dev;     /* ID of device containing file */
      ino_t     st_ino;     /* inode number */
      mode_t    st_mode;    /* protection */
      nlink_t   st_nlink;   /* number of hard links */
      uid_t     st_uid;     /* user ID of owner */
      gid_t     st_gid;     /* group ID of owner */
      dev_t     st_rdev;    /* device ID (if special file) */
      off_t     st_size;    /* total size, in bytes */
      blksize_t st_blksize; /* blocksize for file system I/O */
      blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
      time_t    st_atime;   /* time of last access */
      time_t    st_mtime;   /* time of last modification */
      time_t    st_ctime;   /* time of last status change */
};


int stat(cosnt char *path,struct stat *buf);
//參數*path:文件路徑
//參數*buf:文件信息
//返回值:成功爲0,否則爲-1

int fstat(int fd, struct stat *buf)//參數fd:文件描述符
//參數:*buf:文件信息
//返回值:成功爲0,否則爲-1

int lstat(const char *path, struct stat *buf);
//參數*path:文件路徑
//參數*buf:返回文件信息,針對符號鏈接,lstat返回鏈接文件本身信息(而stat返回鏈接指向的文件信息)
//返回值:成功爲0,否則爲-1

stat、fstat、lstat函數使用實例

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>

#include <stdio.h>

int main()
{
	int fd;
	char *filename = "/home/linuxsystemcode/folder/1.txt";

	fd = open(filename, O_RDWR);
	if(fd < 0)
			printf("Open file failed!\n");

	struct stat info;
	if(stat(filename,&info) < 0)
			printf("Stat failed!\n");
	else
			printf("The file ID of dev: %ld %ld\n",info.st_dev,info.st_size);
	
	if(fstat(fd,&info) < 0)
			printf("Fstat failed!\n");
	else
			printf("The file ID of dev: %ld\n",info.st_dev);
	
	if(lstat("/home/linuxsystemcode/folder/2",&info) < 0)	//2爲文件1.txt的軟鏈接文件
			printf("Lstat failed!\n");
	else
			printf("The file ID of dev: %ld %ld\n",info.st_dev,info.st_size);
	return 0;
}

程序運行結果如下:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cNfi5k2n-1584456565152)(F:\Typora\圖片\1584428935459.png)]

chmod改變文件權限

文件是有訪問權限的,沒有相關的權限就無法對文件進行對應的操作

在終端輸入ls -l可查看文件詳細信息

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8OnamGrx-1584456565155)(F:\Typora\圖片\1584429203687.png)]

  • r表示文件可讀
  • w表示文件可寫
  • x表示文件可執行
  • 轉化爲數字信息爲:r(4)、w(3)、x(1)

chmod相關函數

//頭文件
#include <sys/stat.h>

//相關函數
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

chmod函數使用實例

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
		char *filename = "/home/linuxsystemcode/folder/1.txt";
		
		chmod(filename,0777);
		return 0;
}

程序執行之後,文件的權限被更改

getcwd獲取當前路徑

Linux命令中可以使用pwd查看當前目錄,系統編程中getcwd可以實現同樣的功能

//頭文件
#include <unistd.h>

char *getcwd(char *buf, size_t size);
//參數buf:保存當前目錄的緩衝區
//參數size:buf的長度至少可以爲255字節
//返回值:成功返回指向當前目錄的指針,和buf值一樣,失敗返回NULL

//沒有參數,成功返回當前目錄的指針
char *get_current_dir_name(void);

mkdir創建目錄

Linux命令mkdir可以創建目錄,系統編程中mkdir函數可以創建目錄

//頭文件
#include <sys/stat.h>
#include <sys/types.h>

//mode_t可以使用數字
int mkdir(const char *pathname, mode_t mode);

rmdir刪除目錄

Linux命令rmdir可以刪除目錄,系統編程中rmdir可以刪除目錄

//頭文件
#include <unistd.h>

int rmdir(const char *pathname);
//成功返回0,否則返回-1

chdir切換目錄

Linux下chdir可以切換文件目錄

//頭文件
#include <unistd.h>

int chdir(const char *path);
//函數成功返回0,失敗返回-1

目錄的打開和關閉(opendir和closedir)

opendir和closedir是專門針對目錄的函數,用於打開和關閉目錄

//頭文件
#include <sys/types.h>
#include <dirent.h>

DIR *opendir(const char *name);
//成功返回指向目錄流的指針,失敗則返回NULL

int closedir(DIR *dirp);
//成功返回0,失敗返回-1

鏈接文件

Linux下的鏈接文件分爲兩種:硬鏈接和軟鏈接

在文章的開頭,介紹了inode的相關信息,硬鏈接相當於文件的複製,因爲它和源文件的inode號都是相同的,且文件內容會實時更新,硬鏈接可以用於備份重要文件,刪除一個硬鏈接並不影響節點本身和其它的鏈接

軟鏈接又稱爲符號鏈接,它實際上是一個文本文件,內容是源文件路徑,相當於windows下的快捷方式

使用ln命令可以創建鏈接文件,默認創建硬鏈接文件

硬鏈接

link函數可以創建一個硬鏈接文件

//頭文件
#include <unistd.h>

int link(const char *oldpath, const char *newpath);

軟鏈接

symlink可以創建一個軟鏈接(符號鏈接)

//頭文件
#include <unistd.h>

int symlink(const char *oldpath, const char *newpath);

解除鏈接

使用ulink函數可以解除文件鏈接,如果unlink指向軟鏈接,則刪除軟鏈接;如果指向最後一個硬鏈接,則刪除文件

//頭文件
#include <unistd.h>

int unlink(const char *pathname);

移動文件

Linux命令mv可以移動文件或目錄

//頭文件
#include <stdio.h>

int rename(const char *oldpath, const char *newpath);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章