首页 > 其他分享 >C语言判断文件夹或者文件是否存在的方法

C语言判断文件夹或者文件是否存在的方法

时间:2024-03-12 23:00:29浏览次数:18  
标签:文件 存在 判断 C语言 access 文件夹 printf

方法一:access函数判断文件夹或者文件是否存在

在C语言中,判断文件或文件夹是否存在,可以使用标准库函数access

以下是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main() {
    const char *file = "example.txt";
    if (access(file, F_OK) != -1) {
        printf("文件 '%s' 存在\n", file);
    } else {
        printf("文件 '%s' 不存在\n", file);
    }
 
    const char *dir = "example_dir";
    if (access(dir, F_OK) != -1) {
        printf("文件夹 '%s' 存在\n", dir);
    } else {
        printf("文件夹 '%s' 不存在\n", dir);
    }
 
    return 0;
}

在这个例子中,access函数用于检查文件或文件夹是否存在。F_OK是它的测试模式参数,表示检查文件是否存在。如果文件或文件夹存在,access返回0,否则返回-1并设置errno

请注意,access函数只能判断文件或文件夹是否存在,不能判断具体的访问权限(例如读、写或执行)。如果需要检查具体的访问权限,可以使用access函数并指定相应的测试模式(例如R_OKW_OKX_OK)。

 

当access返回-1,设置errno如下:

  EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。
  EROFS 欲测试写入权限的文件存在于只读文件系统内。
  EFAULT 参数pathname指针超出可存取内存空间。
  EINVAL 参数mode 不正确。
  ENAMETOOLONG 参数pathname太长。
  ENOTDIR 参数pathname为一目录。
  ENOMEM 核心内存不足
  ELOOP 参数pathname有过多符号连接问题。
  EIO I/O 存取错误。

特别提醒:使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。

方法三:stat()函数判断文件夹或者文件是否存在

stat函数可以用来判断路径(相对/绝对路径)和文件是否存在。以及分辨出为目录还是文件。

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

struct stat s;

int main()
{
    //if (stat("..\\Debug\\Test.exe", &s) == 0)
    if (stat("..\\Debug", &s) == 0)
    {
        if (s.st_mode & S_IFDIR)
        {
            printf("这是一个目录\r\n");
        }
        else if (s.st_mode & S_IFREG)
        {
            printf("这是一个文件\r\n");
        }
        else
        {
            printf("非文件非目录\r\n");
        }
    }
    else
    {
        printf("错误,不存在\r\n");
    }
    return  0;
}

 

方法三:fopen函数判断文件是否存在(不推荐)

函数原型:FILE *fopen (char *filename, char *type);

filename:文件路径

type:打开文件的方式(有r、w、r+、w+、a、rb、wb等等)

用于判断文件是否存在可以使用 r 或者 rb ,因为使用 其它方式的话,可能会自动建立文件。 返回值为NULL(打不开)和正数(能打开)。

特别提醒:用这种方法做出的判断是不完全正确的,因为有的文件存在,但是可能不可读。

 

 

总体而言:

  • stat函数的功能是最强大的,因为其不仅仅能判断文件是否存在,还能判断文件的类型以及其他附加信息;
  • acess函数功能比较专一,就是判断文件是否存在。
  • fopen函数不推荐使用用于判断文件存在,因为有BUG——有的文件存在,但是可能不可读。

 

 

参考文章:

https://www.cnblogs.com/michaelcjl/p/15070591.html

https://blog.csdn.net/weixin_44981971/article/details/121662995

标签:文件,存在,判断,C语言,access,文件夹,printf
From: https://www.cnblogs.com/FBsharl/p/18069581

相关文章

  • python安装库文件的时候一个一个安装的py脚本
    在编译安装一些python软件的时候,经常使用pipinstall-rrequirements.txt命令执行。如果其中一个库编译失败,会导致所有的库安装失败,非常费事费力。于是写了一个py小脚本pipinstall.py,将库改为一个一个的安装,这样再碰到编译失败的,也不会影响其它的库,节省时间。文件pipinsta......
  • Windows命令行不加解释器和文件后缀名直接运行Python脚本
    Windows命令行不加解释器和文件后缀名直接运行Python脚本首次编辑:24/2/29/20:30最后编辑:24/2/25/20:44引子都知道Windowscmd中,运行可执行文件和bat时,可以直接输入不带后缀的文件名。rem运行main.exemainrem运行mybat.batmybat而执行python脚本时,却需要指明python作......
  • 【C语言】用C语言写一个猜数字游戏
    目录1.游戏规则2.实现逻辑3.代码展示4.结果展示1.游戏规则1.游戏开始,电脑会从1-100随机生成一个数2.玩家在屏幕上输入猜的数字3.电脑根据这两个数比较大小;若是猜大了,屏幕显示猜大了,若是猜小了,屏幕显示猜小了。4.循环上面的操作,直至猜正确。2.实现逻辑1.首先......
  • C语言字符函数和字符串函数
    前言今天这篇博客咱们一起来认识一些特殊的函数,在编程的过程中,我们经常要处理字符和字符串,为了方便字符和字符串,C语言提供了一些库函数,让我们一起看看这些函数都有什么功能吧!!!个人主页:小张同学zkf若有问题评论区见感兴趣就关注一下吧目录 1.字符分类函数2.字符......
  • 实验1 C语言输入输出和简单程序编写
    实验任务11_11#include<stdio.h>2intmain()3{4printf("O\n");5printf("<H>\n");6printf("II\n");78printf("O\n");9printf("<H>\n");10......
  • C语言学习笔记day3
    1.逗号运算符           逗号运算符连接的表达式,从左至右依次执行,最后一个逗号后面的表达式结果作为   整体的逗号表达式的结果2.sizeof运算符        sizeof(数据类型/变量名)        获得一个数据类型或者变量在内存中所占的......
  • c语言函数传递数组名
    c语言自定义函数中可以在形参中可以使用数组名作为传递代码示例如下#include<stdio.h>floatave(floata[]){ inti; floatb; floatsum=a[0]; for(i=1;i<10;++i) sum=sum+a[i]; b=sum/10; returnb;}intmain(){ floatnum[10],average; inti; for(i=0;i......
  • C语言以空格分割字符串
    方法一、使用<string.h>的strtok()函数原型:char*strtok(char*str1,constchar*str2);头文件:#include<string.h>功能:用指定的分隔符分解字符串参数: char*str1 为要分解的字符串constchar*str2 为分隔符字符串返回值: 返回下一个分割后的(位于最开始的)字......
  • C语言数据结构实现酒店管理
    #include<stdio.h>#include<windows.h>#include<stdlib.h> #include<string.h>//用于用户验证 #defineMAX100//最大房间容量 #defineStytm20#definemAX1024//文件读取字符长 intfileHang(FILE*fp);intlength=0;//房间顺序 typedefintDataType;typ......
  • 实验1 C语言输入输出和简单程序编写
    1#include<stdio.h>usingnamespacestd;intmain(){ printf("O\n"); printf("<H>\n"); printf("II\n"); return0;}2#include<stdio.h>usingnamespacestd;intmain(){floata,b,c; scanf......