c语言判断文件的存在性

 

使用函数access,头文件是io.h,原型:

int   access(const   char   *filename,   int   amode);

amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。

这个函数还可以检查其它文件属性:

06     检查读写权限
04     检查读权限
02     检查写权限
01     检查执行权限
00     检查文件的存在性

 

程序范例:

#include <stdio.h>
#include <io.h>
#include <stdlib.h>
//判断文件是否存在,如果存在则重命名
int isExist(char *filename)
{
 return (access(filename, 0) == 0);
}
int main(void)
{
 int i,j;
 char line[100];
 //读ini文件
 FILE *fp = fopen("c://test.ini","r");
 if(fp == NULL)
 {
  printf("file open failed!/n");
  return 0;
 }
 char oldName[100],newName[100];
 while(fgets(line, 100, fp))
 {
  printf("%s/n",line);
  i = 0;
  j = 0;
  while(line[i] != ',')
  {
   oldName[j] = line[i];
   ++i;
   ++j;
  }
  ++i;
  oldName[j] = '/0';
  j = 0;
  while(line[i] != '/0')
  {
   newName[j] = line[i];
   ++i;
   ++j;
  }
  newName[j] = '/0';
  char cmd[100]; 
  if(isExist(oldName))
  {
   //重命名,也可以指定文件名的全路径
   sprintf(cmd,"ren %s %s",oldName,newName);
   printf("cmd: %s/n",cmd);
   if(system(cmd) != 0)
   {
    printf("rename failed!/n");
   }
  }
 } 
 return 0;
}


其中test.ini文件中存放着需要修改的文件名及重新命名的名字,以逗号分开

2006510102112.dat,2006510102112.doc  
2006510102151.dat,2006510102151
.doc 
200651011822.dat,200651011822
.xls 
200651011823.dat,200651011823.doc 

 

<think>我们被要求使用C语言判断文件是否存在。根据引用,主要方法是使用access函数,并检查F_OK标志。 引用[1][2][3][4][5]都提到了使用access函数,并包含头文件<unistd.h>。 函数原型:int access(const char *pathname, int mode); 当mode为F_OK时,用于检查文件是否存在。 返回值:如果文件存在,返回0;如果存在或者发生错误,返回-1,并且设置errno。 步骤: 1. 包含头文件:<unistd.h> 和 <stdio.h>(用于输出) 2. 调用access函数,传入文件路径和F_OK。 3. 根据返回值判断。 注意:在Windows环境下,access函数也在<io.h>中,但用法类似。过,引用中主要讨论的是Linux环境,但函数在Windows的兼容版本也存在。 示例代码: 根据引用[2]和[4]的示例,我们可以写出如下代码: 另外,引用[3]还提到了其他方法,比如使用opendir、stat等,但access是最直接用于检查文件是否存在的方法。 因此,我们给出两种常见的方法:access和stat(如果用户需要更多信息,比如文件类型、大小等,可以用stat)。 方法一:使用access 方法二:使用stat(需要包含<sys/stat.h>) 下面分别展示两种方法。</think>### C语言判断文件存在的方法 在C语言中,判断文件是否存在主要有两种可靠方法:使用`access()`函数或`stat()`函数。以下是详细说明和示例代码: #### 方法一:使用`access()`函数(推荐) 这是最简洁高效的方法,通过`F_OK`模式检查文件是否存在: ```c #include <stdio.h> #include <unistd.h> // 必需的头文件 int fileExists(const char* filename) { return access(filename, F_OK) == 0; // 返回0表示存在 } int main() { const char* file = "test.txt"; if (fileExists(file)) { printf("%s 存在\n", file); // 文件存在 } else { printf("%s 存在\n", file); // 文件存在 } return 0; } ``` **特点**: 1. 仅检查文件是否存在验证权限 2. 返回值:存在返回`0`,存在返回`-1`(需结合`errno`判断具体错误)[^2][^4] 3. 需要包含头文件:`#include <unistd.h>` #### 方法二:使用`stat()`函数 可获取更详细的文件信息(如类型、大小等): ```c #include <stdio.h> #include <sys/stat.h> // 必需的头文件 int fileExists(const char* filename) { struct stat fileStat; return stat(filename, &fileStat) == 0; // 返回0表示存在 } // main函数用法同上 ``` **特点**: 1. 可获取文件元数据(通过`struct stat`结构体) 2. 能区分文件类型(普通文件、目录等) 3. 需要包含头文件:`#include <sys/stat.h>` #### 错误处理建议 当文件存在时,可通过`errno`获取具体原因: ```c #include <errno.h> if (!fileExists("data.bin")) { switch(errno) { case ENOENT: // 文件存在 printf("文件路径错误\n"); break; case EACCES: // 权限足 printf("无访问权限\n"); break; case ENOMEM: // 内存足 printf("系统资源耗尽\n"); break; } } ``` 常见错误码参考[^3][^5]: - `ENOENT`:文件存在 - `EACCES`:权限足 - `ENOTDIR`:路径中包含非目录项 - `ENAMETOOLONG`:路径过长 #### 注意事项 1. **符号链接**:两种方法均会追踪符号链接指向的实际文件 2. **权限限制**:即使文件存在,无父目录权限也可能返回存在[^4] 3. **并发场景**:检查后文件可能被删除,存在时间窗口问题 4. **Windows兼容**:Windows需使用`_access()`(在`<io.h>`中) > 建议优先使用`access()`进行存在性检查,需要详细元数据时再用`stat()`[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值