statおよびlstat
statコマンドの使用:
/**
* @author IYATT-yx
* @brief 获取文件部分属性
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("请指定一个参数为要查询大小的文件!\n");
return -1;
}
struct stat st;
int ret = stat(argv[1], &st);
if (ret == -1)
{
perror("stat");
return -1;
}
printf("%s的大小为%ld\n", argv[1], st.st_size);
// 文件类型, 1法
if (S_ISREG(st.st_mode))
{
printf("1@这是一个普通文件\n");
}
else if (S_ISDIR(st.st_mode))
{
printf("1@这是一个目录文件\n");
}
else if (S_ISLNK(st.st_mode))
{
printf("1@这是一个符号链接文件\n");
}
else if (S_ISSOCK(st.st_mode))
{
printf("1@这是一个套接字文件\n");
}
else if (S_ISBLK(st.st_mode))
{
printf("1@这是一个块设备文件\n");
}
else if (S_ISCHR(st.st_mode))
{
printf("1@这是一个字符设备文件\n");
}
else if (S_ISFIFO(st.st_mode))
{
printf("1@这是一个管道文件\n");
}
// 文件类型, 2法
int type = st.st_mode & S_IFMT;
switch (type)
{
case S_IFREG:
printf("2@这是一个普通文件\n");
break;
case S_IFDIR:
printf("2@这是一个目录文件\n");
break;
case S_IFLNK:
printf("2@这是一个符号链接文件\n");
break;
case S_IFSOCK:
printf("2@这是一个套接字文件\n");
break;
case S_IFBLK:
printf("2@这是一个块设备文件\n");
break;
case S_IFCHR:
printf("这是一个字符设备文件\n");
break;
case S_IFIFO:
printf("这是一个管道文件\n");
break;
default:
break;
}
}
上記のstat
関数の例も同様lstat
で、fstat
主な違いは、クエリがソフトリンクファイルの場合のstatとlstatソフトリンクファイルの使用です。statはクエリに侵入してソフトリンクポイントをファイルしますが、lstatはチェックできます。ソフトリンクされたファイル自体の属性。fstatは主にパラメーターの違いです。statとlstatはどちらもファイル名で照会され、fstatは開いているファイルの戻り値ファイル記述子でman
照会されます。特定の情報はコマンドで照会できます。また、statファミリーの関数はls -l
、ほぼ同じように表示されるファイル属性とコンテンツをチェックできることにも注意してください。
stat構造
struct stat
{
// 文件的设备编号
dev_t st_dev;
// 节点
ino_t st_ino;
// 文件的类型和存取的权限
mode_t st_mode;
// 链到该文件的硬链接数目
nlink_t st_nlink;
// 用户ID
uid_t st_uid;
// 组ID
gid_t st_gid;
// (设备类型)若此文件为设备文件,则为其设备编号
dev_t st_rdev;
// 文件字节数
off_t st_size;
// 块大小 (文件系统的I/O缓冲区大小)
blksize_t st_blksize;
// 块数
blkcnt_t st_blocks;
// 最后一次访问时间
time_t st_atime;
// 最后一次内容修改时间
time_t st_mtime;
// 最后一次属性修改时间
time_t st_ctime;
};
st_mode(16ビット整数)
- 0〜2人oその他のユーザー
S_IROTH | 00004 | 読んだ |
S_IWOTH | 00002 | 書く |
S_IXOTH | 00001 | 実施した |
S_IRWXO | 00007 | o以外の権限をマスク、フィルタリングする |
※3〜5桁はユーザーグループに属します
S_IRGRP | 00040 | 読んだ |
S_IWGRP | 00020 | 書く |
S_IXGRP | 00010 | 実施した |
S_IRWXG | 00070 | g以外の権限をマスク、フィルタリングする |
* 6〜8uのファイル所有者
S_IRUSR | 00400 | 読んだ |
S_IWUSR | 00200 | 書く |
S_IXUSR | 00100 | 実施した |
S_IRWXU | 00700 | u以外の権限をマスク、フィルタリングする |
* 12〜15ビットのファイルタイプ
S_IFSOCK | 0140000 | ソケット |
S_IFLNK | 0120000 | シンボリックリンク(ソフトリンク) |
S_IFREG | 0100000 | 通常のファイル |
S_IFBLK | 0060000 | ブロックデバイス |
S_IFDIR | 0040000 | 目次 |
S_IFCHR | 0020000 | キャラクターデバイス |
S_IFIFO | 0010000 | パイプライン |
S_IFMT | 0170000 | フラッドコード、非ファイルタイプ情報のフィルタリング |
/**
* @author IYATT-yx
* @brief 检测文件属性: 存在,读,写,操作
*/
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv)
{
if (argc != 2)
{
printf("请指定一个参数为要查询的文件!\n");
return -1;
}
if (access(argv[1], F_OK) == -1)
{
perror("access");
return -1;
}
else
{
if (access(argv[1], R_OK) == 0)
{
printf("R");
}
if (access(argv[1], W_OK) == 0)
{
printf("W");
}
if (access(argv[1], X_OK) == 0)
{
printf("X");
}
printf("\n");
}
}
ファイルのアクセス許可の変更:chmod
function
ファイルの所有者またはグループの変更:chown
function
ファイルサイズの変更:truncate
function
開いているファイルの属性の変更:fcntl
function