首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C:检查文件的类型.使用lstat()和宏不起作用

  1. C:检查文件的类型

在C语言中,检查文件的类型可以使用stat结构体和lstat函数。stat结构体包含了文件的各种信息,其中st_mode字段包含了文件的类型信息。可以使用位运算符和宏来判断文件的类型。

代码语言:c
复制
#include <sys/types.h>
#include <sys/stat.h>
#include<stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    struct stat file_stat;
    int result;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s <path>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    result = lstat(argv[1], &file_stat);
    if (result == -1) {
        perror("lstat");
        exit(EXIT_FAILURE);
    }

    if (S_ISREG(file_stat.st_mode)) {
        printf("Regular file\n");
    } else if (S_ISDIR(file_stat.st_mode)) {
        printf("Directory\n");
    } else if (S_ISCHR(file_stat.st_mode)) {
        printf("Character device\n");
    } else if (S_ISBLK(file_stat.st_mode)) {
        printf("Block device\n");
    } else if (S_ISFIFO(file_stat.st_mode)) {
        printf("FIFO\n");
    } else if (S_ISLNK(file_stat.st_mode)) {
        printf("Symbolic link\n");
    } else if (S_ISSOCK(file_stat.st_mode)) {
        printf("Socket\n");
    } else {
        printf("Unknown file type\n");
    }

    exit(EXIT_SUCCESS);
}

这段代码可以检查文件的类型,包括普通文件、目录、字符设备、块设备、FIFO、符号链接和套接字等。

  1. 使用lstat()和宏不起作用

如果使用lstat()函数和宏仍然无法检查文件的类型,可能是因为权限不足或者文件不存在。可以检查程序的权限设置和文件路径是否正确。如果仍然无法解决问题,可以尝试使用其他方法,例如stat()函数或fstat()函数,或者使用其他编程语言实现。

推荐的腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++】C++ 语言对 C 语言加强 ③ ( 类型检查增强 - 所有函数变量必须有类型 | 新增 bool 类型 - bool 类型简介 )

一、类型检查增强 - 所有函数变量必须有类型 1、C 语言函数类型 - 函数参数与返回值类型可以不确定 在 C 语言中 , 函数返回值类型在定义时可以不写明 , 函数参数如果为空 , 可以任意传入参数...1 2、C++ 语言函数类型 - 函数参数与返回值类型必须写明 在 C++ 语言中 , 所有的 变量 函数 , 都必须有类型 ; 将上述 C 语言中代码拷贝到 C++ 环境中 , 然后再次进行编译...只有 0 1 概念 , 使用 int 类型 + 定义 形式表示布尔值 , 如下代码所示 ; // 使用 定义 定义布尔类型 #define BOOL int #define TRUE 1 #...define FALSE 0 // 使用 定义 定义一个布尔变量 BOOL flag = FALSE; C++ 语言在 C 语言基础之上 , 新增了 布尔类型 , 类型名称是 bool ; bool...布尔类型取值 : 取值有两个 true false ; true 表示真 , 在 编译器 内部使用 1 表示 ; 如果为 bool 变量赋值 非 0 数值 ( 包括负数 ) , 会转为 true

35530

【嵌入式】C语言程序调试使用技巧

gcc编译过程中,会生成一些,可以使用这些分别打印当前源文件信息,主要内容是当前文件、当前运行函数当前程序行。...该过程同样是有编译器产生,编译器在编译源文件时候,如果遇到了类似的,会自动根据程序中表达式内容,生成一个字符串。...使用这种形式可以将参数传递给一个参数。args…是参数,表示可变参数列表,使用##args将其传给printf函数。 总结 ##是C语言预处理阶段连接操作符,可实现参数连接。 4....这个时候就要加入分级检查机制,可以定义不同调试级别,这样就可以对不同重要程序不同模块进行区分,需要调试哪一个模块就可以打开那一个模块调试级别。...使用do…while定义 使用定义可以将一些较为短小功能封装,方便使用形式函数类似,但是可以节省函数跳转开销。

67410
  • C++】const 关键字 与 #define 定义 对比 ( 相同点 - 都可定义常量优化性能 | 不同点 - const 常量进行作用域检查类型检查 )

    , 如果数组大小不是常数 , 在 C 语言 C++ 语言 中都会在编译时报错 ; 在 C/C++ 编译环境中会报错 ; 在编译 Linux 内核时 , 如果出现这种情况 , 编译会通过 , Linux...定义 作为 数组大小 , 编译会通过 ; 代码示例 : // 包含 C++ 头文件 #include "iostream" // 使用 std 标准命名空间 // 该命名空间中 , 定义了很多标准定义...不同点 ---- 在 C++ 语言中 , const 关键字 与 #define 定义 不同点 : const 常量 是 编译器 在 编译阶段 进行处理 , 会提供 类型检查 作用域检查 ; #...define 定义 是 预处理器 在 预处理阶段 进行处理 , 不会进行 类型检查 作用域检查 , 只是进行单纯 文本替换 ; 在下面的代码中 , 只要调用了 fun1 函数 , 执行了 #define...标准做法是 , 在函数中使用定义 a , 如果在函数结尾不再使用定义 , 那么可以卸载该定义 , 使用 #undef a 可卸载定义 , 使用 #undef 可卸载所有定义 ; void

    36240

    Linux笔记(6)| 文件属性

    关于文件类型文件权限,可以参考之前文章:Linux笔记(2)| 进阶命令 1、常用文件属性获取 stat函数 int stat(const char *pathname, struct stat...这些可以通过inode查询,譬如S_ISREG返回值是1表示这个文件是一个普通文件,如果文件不是普通文件则返回值是0....2、文件权限管理 (1)access函数检查权限设置 int access(const char *pathname, int mode); 文本权限管控其实蛮复杂,一般很难很容易的确定对一个文件是否具有某种权限...chmod命令其实内部是用linux一个叫chmodAPI实现。 注意:只有在Linux原生目录中,改变文件权限才有效,在共享文件夹中会不起作用。...readdir使用 (2)readdir函数调用一次就会返回一个structdirent类型指针,这个指针指向一个结构体变量,这个结构体变量里面记录了一个目录项(所谓目录项就是目录中一个子文件)。

    1.5K30

    深入剖析C#中接口类型使用场景

    在面向对象程序设计中,接口是一种重要语言特性。在 C# 中,接口(interface)是一种特殊类型,它定义了一个类或结构体应该支持一组方法、属性事件。...接口提供了一种可扩展松散耦合方式来定义程序设计契约,常用于实现多态组件化开发。本文将从架构师角度深入分析 C# 中接口类型使用场景,并以 C# 代码实例来说明。...这些成员只有签名,没有实现,实现是由接口实现者提供。2. 接口使用接口在 C# 中常用于两种情况:2.1. 实现多态接口提供了一种实现多态方式。...,比如使用 MongoDB 使用 SQL Server 数据访问组件:public class MongoDBAccess : IDataAccess{ public void Query()...我们可以在构造函数中注入不同数据访问组件,实现不同数据访问方式。综上所述,接口是 C# 中一项重要特性,可以用于实现多态组件化开发。

    55830

    Linux下ls命令显示符号链接权限为777探索

    一、摘要 ls是LinuxUnix下最常使用命令之一,主要用来列举目录下文件信息,-l参数允许查看当前目录下所有可见文件详细属性,包括文件属性、所有者、文件大小等信息。...关于fileinfo结构体源码中已经给了很好注释,其中struct stat类型变量stat具体描述了文件信息,往往由stat()或lstat()函数返回。...(内核中使用SYSCALL_DEFINE2定义来定义系统调用,展开就是声明形式。)...这里会发现,4.10内核中同时存在newstat与stat,无论新旧,实现都是使用了vfs_stat函数,传入参数为kstat,差别在于倒数第二个参数类型。(但是这个参数具体有什么作用?...*类型,其中__user定义为空,可能是为了标记该参数由用户传入吧。

    6.5K50

    使用 C# 9 records作为强类型ID - 路由查询参数

    上一篇文章,我介绍了使用 C# 9 record类型作为强类型id,非常简洁 public record ProductId(int Value); 但是在强类型id真正可用之前,还有一些问题需要解决...路由查询字符串参数模型绑定 假设我们有一个这样实体: public record ProductId(int Value); public class Product { public...ProductId,由于它不是int,是我们定义类型ID,并且没有关联类型转换器。...通用强类型id转换器 首先,让我们创建一个Helper •检查类型是否为强类型ID,并获取值类型•获取值得类型,创建并缓存一个委托 public static class StronglyTypedIdHelper...; } } 到这里,我们可以直接删除之前 ProductIdConvert, 现在有一个通用可以使用,现在.NET Core 路由匹配已经没有问题了,接下来文章,我会介绍如何处理在JSON

    1.9K20

    Linux系统中文件属性权限实战操作

    API打开看到;常见文件属性信息查看API有三个:stat、fstat、lstat,三个作用一样,参数不同,细节略有不同(-----fstatstat区别是:stat是从文件名出发得到文件属性信息结构体...)----------lstatstat/fstat差别在于:对于符号链接文件,statfstat查阅是【符号链接文件指向那个文件属性】,而lstat查阅是符号链接文件本身属性-----...我们也可以使用命令stat来查看文件属性,但是实际上stat命令内部就是使用stat系统调用(也就是我们api函数stat)来实现,查看结果如下: 注:这里最近更改(modify)指的是修改文件内容...\n", buf.st_blksize); return 0; } 演示效果: b、判断文件类型文件属性中文件类型标志在struct stat结构体mode_t st_mode元素中...结构体中mode_t st_mode元素作为参数传给这些中),根据返回值就可以判断文件类型等。

    71120

    C# 遍历读取某个目录文件夹下不同类型文件其子文件夹(里面可能又有许多文件

    首先获取到文件目录,这里是参数targetDirectory传递进来: //对该路径下文件进行遍历,获取文件名  string[] fileEntries = Directory.GetFiles...,而gdb是文件夹,里面包含多个文件                         messagebox.Show(fileName); //这里仅仅是弹框显示文件名,可以换成别的复杂功能。                         ...if (fileName.EndsWith(".txt"))  // 比较不同点: mdb是一种文件,而gdb是文件夹,里面包含多个文件                         messagebox.Show...(fileName);                      //此处可以写代码:添加if判断,显示txt等其他类型文件...                ...//对该路径下 文件夹 进行遍历,获取文件夹                 string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory

    3.8K10

    Linux stat函数_python系统调用函数

    通过ls命令-i选项可以查看文件inode节点编号。 硬链接文件文件inode节点编号一样,说明它们引用是同一个inode节点。...,第一列所显示文件类型,在上面列出内容中,中间一列数字用来标识文件类型,从S_IFSOCK到S_IFIFO就是我们所熟知7种文件类型,S_IFMT是文件类型掩码。...通过S_IFMT与运算,就可以把标识文件类型位保留下来(也就是前两个数017,第一个0表示8进制,后面17共四位 1 111 用来标识文件类型,那么S_IFMT用二进制表示就是1111后面加12个...这是通过掩码方式来判断文件类型。 另外一种判断文件类型方法是使用它为我们提供来判断,7种文件类型判断相关如下所示,这里m是指stat结构体中st_mode。...; 如果我们只是用cat查看一下文件,那么只有Access时间会更新;如果我们只是修改文件权限,比如增加可执行权限,那么只有Change时间更新;如果我们使用重定向往文件中写入内容,那么Modify

    2.1K40

    Linux下文件IO编程

    Linux 中用户编程接口(API)遵循了 UNIX 中最流行应用编程界面标准—— POSIX。这些系统调用编程接口主要是通过 C 库(libc)实现。...(stat/lstat/fstat) 文件I/O简介 POSIX(可移植操作系统接口)定义一组函数 不提供缓冲机制,每次读写操作都执行系统调用 核心概念是文件描述符 访问各种类型文件 文件描述符 每个打开文件对应一个文件描述符...(int fd,struct stat *buf); 成功时返回0;出错时返回EOF; 如果path是符号链接stat获取是目标文件属性;而lstat获取是链接文件属性 struct stat是存放文件属性结构体类型...: 结构体类型 作用 mode_t st_mode 类型访问权限 uid_t st_uid 所有者id uid_t st_gid 用户id off_t st_size 文件大小 time_t st_mtime...最后修改时间 st_mode通过系统提供来判断文件类型: 通过(st_mode&0170000)计算后得到以下进行匹配 文件类型 计算值 S_ISREG(st_mode) 普通文件 0100000

    2.5K10

    Linux批量替换某种类型文件字符串-sedgrep命令使用

    今天在修改rpm打包spec配置文件时,遇到一个问题就是:需要将100个左右源代码中spec配置文件Release一行中发布版本号使用变量%{_release}进行替换。    ...如果要手工修改需要修改100多次,但是使用sedgrep命令很简单: sed -i "s/Release: 1/Release: %{_release}/g" 'grep Release:...1 -rl --include="*.spec" ./' 以上命令有待求证,暂时这么写了,明天确认一下再加以修改吧。...Linux下批量替换多个文件字符串简单方法。 用sed命令可以批量替换多个文件字符串。...Linux批量替换多个文件中字符串 2、Linux shell 批量替换多个文件中字符串 Linux shell 批量替换多个文件中字符串 接 3、SED与AWK学习笔记 SED与AWK学习笔记

    5.7K20

    使用C语言中文件有什么技巧注意事项吗?为什么不直接包含C文件呢?

    从事嵌入式开发多年,对于C语言使用频率比较多,现在讲讲C语言在平时编程工作中经常出现一些问题,就以楼主题目为切入点分析归纳下,分享给正在使用或者学习C语言小伙伴 ?...C语言头文件有什么用处 在平时项目开发过程中特别是几个项目组在一起工作时候,有的时候代码不是完全开放,这个时候头文件作用就体现出来了,在头文件中可以看到这个模块使用结构体,以及静态变量或者定义一些...所以后续C++加强了语法检查,一般在初学c++泛型编程都会有一种压抑感觉,这是由于C++语法特性决定,这种编程语言在嵌入式开发过程中使用也是比较多。 ?...使用C语言头文件需要注意事项 头文件里面主要声明一些函数列表,定义一些,还会定义一些核心结构体,还会有一些静态全局变量,头文件中尽量不要使用全局变量,因为全局变量在管理上会显得麻烦很多,增加出现问题概率...头文件在编译时候里面的都会舒展开,为了防止一个文件被包含多次就会在头文件开始位置设置#ifndef 这种字眼就是为了避免重复引用。

    1.6K30

    C语言】内联函数总结

    staticinline联合使用 static是静态修饰符,由其关键字修饰变量会保存到全局数据区,对于普通局部变量或者全局变量,都是由系统自动分配内存,并且当变量离开作用域时候释放掉,而使用static...inline函数其实就是空间换时间 inline 区别 虽然inline函数带参数很像,但是在使用方法上还是有很大区别的: inline()函数 带参数 展开时机 在编译时候展开...,因此inline关键字是一个编译关键字 在预处理时展开,因此#define关键字是一个预处理关键字 参数类型检查 inline()函数是一中函数,会进行严格参数类型检查 不会检查参数类型,只是做简单字符串替换...只是做字符串替换操作,而不了解语句含义 是否一定被展开 不一定,是否展开由编译器决定 一定,只要使用就可以保证被展开 接口封装 是 否 是否支持调试 是 否 总结 内联函数相比函数,会进行语法检查...函数是在预处理阶段生效,内联函数是在编译阶段进行语法检查然后替换。 内联函数相比普通函数,少了上下文切换步骤所以执行会更快一些。

    29510

    Objective-C 中 9 种避免使用 Xcode 预处理器方法

    除了极少数例外,使用 Xcode 预处理器是一种代码气味。C++ 程序员们已经深有体会:" "。不幸是,还有很多 Objective-C 程序员尚未领悟到这一点。...本文是Objective-C代码气味系列文章中一篇。 这是一个可以在终端运行便捷命令。它可以检查并显示当前目录下文件,预处理器使用情况,你应该仔细检查。...一般来说,人们使用 #define 是因为构造一个危险比构造一个安全常量更容易。但在这里,语言所提供不仅更安全,而且更简单。 枚举类型不必命名。...但如果将这些值作为参数传递,就需要定义一个类型名,以增加编译器检查语义。...后来有人发现,如果代码中已经包含了注释,这种方法就不起作用了。怎么办呢?当时答案是使用预处理器:用 #if 0 封装代码就可以了。 但那是很久以前事了,那时还没有现代集成开发环境彩色编码方式。

    12010

    C 语言】文件操作 ( 使用 fread fwrite 实现二进制文件拷贝 | stat 统计文件大小 | feof 判定文件结尾 )

    文章目录 一、stat 统计文件大小 二、feof 判定文件结尾 三、使用 fread fwrite 实现二进制文件拷贝 一、stat 统计文件大小 ---- 统计文件大小 , 需要借助 stat...结构体 , 调用 stat 方法 , 将该结构体指针作为参数传入 , 文件大小会写出到 stat 结构体 _off_t st_size 成员中 ; = struct stat { _dev_t...文件大小 stat("D:/File/src.avi", &st); // 计算缓冲区文件大小 int buffer_size = st.st_size; 二、feof 判定文件结尾...---- 进行文件操作时 , 使用 feof 方法判定是否读取到了文件结尾 ; 参考 【C 语言】文件操作 ( 文件结尾判定 ) 博客 ; 代码示例 : // 判定文件指针是否指向文件末尾...feof(p_src)) { } 三、使用 fread fwrite 实现二进制文件拷贝 ---- 代码示例 : #include #include <stdlib.h

    68810

    Linux文件管理参考

    lstat函数与stat函数类似,但当命令文件是一个符号链接时,lstat返回该符号链接有关信息,而不是由该符号链接引用文件信息。lstat称为不跟踪符号链接。...这三个函数有一个相同类型参数struct stat *类型buf,buf是一个指针。 文件类型文件:#include ?...1 如果要解除对文件链接,必须对包含该目录项目录具有写执行权限。...只有当链接计数达到0时,该文件内容才可被删除,如果内核首先检查是否有进程打开了该文件, 在检查连接数,二者计数都为0时,那么才删除文件内容。...一个目录有写执行权限决定了在该目录下可以新建文件以及删除文件,不代表能否写目录本身。

    98120

    Git 中文参考(八)

    “ASSUME UNCHANGED”BIT Git 中许多操作依赖于您文件系统以实现高效lstat(2)实现,因此可以便宜地检查工作树文件st_mtime信息,以查看文件内容是否已从索引文件中记录版本更改...不幸是,一些文件系统效率低lstat(2)。如果您文件系统是其中之一,则可以将“假设未更改”位设置为未更改路径,以使 Git 不执行此检查。...foo.c (8) $ git diff --name-only (9) M foo.c 强制 lstat(2)为匹配索引路径设置“假定未更改...你可以告诉我事后变化。 现在它检查 lstat(2)并发现它已被更改。...这使得 git 可以避免必须 lstat()每个文件来查找修改过文件。 与未跟踪缓存一起使用时,它可以通过避免扫描整个工作目录以查找新文件成本来进一步提高性能。

    13910
    领券