3 operaciones de directorio de Linux


Prefacio (incluido el índice)


Cambio de nombre de archivo: renamefunción
Modificar la ruta del proceso actual: chdirfunción
Obtener la ruta del proceso actual: getcwdfunción
Crear directorio: mkdirfunción
Eliminar archivo: removefunción


/**
 * @author IYATT-yx
 * @brief 读目录
 */
#define _GNU_SOURCE
#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
#include <string.h>

int main(int argc, char **argv)
{
    
    
    if (argc != 2)
    {
    
    
        printf("请指定要打开的目录!\n");
        return -1;
    }

    DIR *dirPtr = opendir(argv[1]);
    if (dirPtr == NULL)
    {
    
    
        perror("opendir");
        return -1;
    }

    size_t blk_t = 0, chr_t = 0, dir_t = 0, lnk_t = 0, fifo_t = 0, reg_t = 0, sock_t = 0, total = 0;
    struct dirent *dir;
    printf("目录中含有的文件:\n");
    while ((dir = readdir(dirPtr)) != NULL)
    {
    
    
        // 过滤掉 . 和 ..
        if (strcmp(".", dir->d_name) == 0 || strcmp("..", dir->d_name) == 0)
        {
    
    
            continue;
        }

        printf("%s\t", dir->d_name);

        ++total;
        // 各种文件类型计数
        switch (dir->d_type)
        {
    
    
            case DT_BLK:
                ++blk_t;
                break;
            case DT_CHR:
                ++chr_t;
                break;
            case DT_DIR:
                ++dir_t;
                break;
            case DT_LNK:
                ++lnk_t;
                break;
            case DT_FIFO:
                ++fifo_t;
                break;
            case DT_REG:
                ++reg_t;
                break;
            case DT_SOCK:
                ++sock_t;
                break;
            default:
                break;
        }
    }
    printf("\n\n");

    printf("总文件个数: %zd\n", total);
    printf("块设备个数: %zd\n", blk_t);
    printf("字符设备个数: %zd\n", chr_t);
    printf("目录个数: %zd\n", dir_t);
    printf("软链接个数: %zd\n", lnk_t);
    printf("管道个数: %zd\n", fifo_t);
    printf("普通文件个数: %zd\n", reg_t);
    printf("套接字个数: %zd\n", sock_t);

    closedir(dirPtr);
}

Ejecute el programa, el parámetro especifica la ruta. El programa mostrará los nombres de los archivos en el directorio, y contará el número total de archivos y los números respectivos de varios tipos de archivos. A continuación se muestran las estructuras y macros relacionadas utilizadas:

estructura dirent

struct dirent
{
    
    
	// 此目录进入点的inode
	ino_t d_ino;
	// 目录文件开头到此目录进入点的位移
	ff_t d_off;
	// d_name 的长度,不包括NULL字符
	signed short int d_reclen;
	// d_name所指的文件类型
	unsigned char d_type;
	// 文件名
	har d_name[256];
}

d_type

  • Dispositivo de bloque DT_BLK
  • Dispositivo de caracteres DT_CHR
  • Directorio DT_DIR
  • Enlace flexible DT_LNK
  • Canalización DT_FIFO
  • Archivo ordinario DT_REG
  • Toma DT_SOCK
  • DT_UNKNOWN desconocido

Supongo que te gusta

Origin blog.csdn.net/weixin_45579994/article/details/112752498
Recomendado
Clasificación