c语言检测文件是否存在int __cdecl access(const char *, int);
最近写代码,遇到很多地方需要判断文件是否存在的。网上的方法也是千奇百怪,“百家争鸣”。
fopen方式打开的比较多见,也有其他各种方式判断文件是否存在的,由于其他方法与本文无关,所以不打算提及。
笔者近来使用winapi比较多,于是顺便搜索了msdn,找到了一个函数:PathFileExists
BOOL PathFileExists(
_In_ LPCTSTR pszPath
);
以下是笔者最初的方法,windows api原则上提供的函数应该是最合理高效的,起码这个方法在windows平台上来说有足够的官腔味。
/*Minimum supported client: Windows 2000 Professional, Windows XP [desktop apps only]
Minimum supported server: Windows 2000 Server [desktop apps only]
DLL: Shlwapi.dll (version 4.71 or later) */
#include <Windows.h> //Windows API FindFirstFile
#include <Shlwapi.h> //Windows API PathFileExists
#pragma comment(lib, "shlwapi.lib") int main(void)
{
if(PathFileExists("setting.ini")){
printf("load custom setting...\n");
}else{
printf("setting file missing,load default..\n");
}
return ;
}
群里有朋友提起fopen是posix系统中打开文件fd的标准open接口。笔者也曾疑虑,如果一个文件几十个G,会不会在fopen的过程中占用很多资源,
后来求证得到的回复:
肯定不会加载啊
正如你说的,如果文件 xxxG 怎么办文件是用指针访问的,所以不用担心你的问题
由于笔者目前研究范围和能力有限,没去研究。
笔者的程序有时候需要兼容linux,通常会在cygwin下面编译并测试,也是再三觉得,过于依赖于特定操作系统的api有点不妥。
在google上搜索了了一下,stackoverflow给出了一个答案:
What's the best way to check if a file exists in C? (cross platform)
使用函数
int __cdecl access(const char *, int);
笔者常用的tcc,Visual c++ 6.0,gcc 打开tcc-win32-0.9.26查看相关引用头文件时发现unistd.h只是简单的#include了一次io.h
于是大胆的猜想了一下,Visual c++ 6.0的头文件目录里可能有io.h文件,打开看了一下,果然有,也有相关的函数申明。
根据stackoverflow的方法,笔者写了一段兼容代码,以下代码支持Linux-gcc,TCC(windows),Visual C++6.0,Mingw-gcc(Cygwin)
#include <stdio.h>
#if defined(WIN32) || defined(_WIN32) || defined(WIN64)|| defined(_WIN64)
#include <io.h>
#ifndef F_OK
#define F_OK 0 /* Check for file existence */
#endif
#endif
#if defined(__CYGWIN__)|| defined(__linux__)|| defined(linux) || defined(__linux)
#include <unistd.h>
#endif int main(void)
{
if( access( "setting.ini", F_OK ) != - ) {
printf("load custom setting...\n");
} else {
printf("setting file missing,load default..\n");
}
}
至此,妈妈再也不用担心我不会确认文件是否存在了 ;)
c语言检测文件是否存在int __cdecl access(const char *, int);的更多相关文章
- Linux C语言 检测文件是否存在
头文件 unistd.h ) { // file exists } else { // file doesn't exist } You can also use R_OK, W_OK, and X_ ...
- C语言判断文件夹或者文件是否存在的方法【转】
C语言判断文件夹或者文件是否存在的方法 方法一:access函数判断文件夹或者文件是否存在 函数原型: int access(const char *filename, int mode); 所 ...
- Linux 用C语言判断文件和文件夹
Linux 用C语言判断文件和文件夹 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #inc ...
- linux编程stat检测文件元数据信息
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/sta ...
- C语言判断文件是否存在(转)
int access(const char *filename, int amode); amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1. 这个函 ...
- C语言判断文件是否存在
用函数access,头文件是io.h,原型: int access(const char *filename, int amode); amode参数为0时表示检查文件的 ...
- c语言 判断文件是否存在
使用access函数 功能: 检查调用进程是否可以对指定的文件执行某种操作. 用法: #include <unistd.h> #include <fcntl.h> int ac ...
- 第28月第3天 c语言读写文件
1. int ConfigIniFile::OpenFile( const char* szFileName ) { FILE *fp; size_t nLen; int nRet; CloseFil ...
- linux C之判断文件或目录是否存在 access函数
http://blog.sina.com.cn/s/blog_6a1837e90100uh5d.html access():判断是否具有存取文件的权限 相关函数 stat,open,chmod, ...
随机推荐
- HackerRank "Larry's Array"
I caught the sparkle in my mind and got AC1 ! It is a great great experience ! So the basic idea: pe ...
- 关于动态生成data组件
/*! * WeX5 v3 (http://www.justep.com) * Copyright 2015 Justep, Inc. * Licensed under Apache License, ...
- zookeeper安装及部署
安装及部署 一. 单机安装.配置 1.下载zookeeper二进制安装包 下载 curl -L -O http://apache.fayea.com/zookeeper/stable/zookeepe ...
- java语言实现堆排序
package secondChapter; import java.util.Random; public class HeapSort { private static int AHeapSize ...
- 文件_ _android从资源文件中读取文件流并显示的方法
======== 1 android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...
- c#获取枚举
在实际开发项目中,我们定义了一个枚举,往往我们需要在下拉框或其它地方展示枚举.为了加深印象,也为了帮到有需要的人,我写了一个DEMO. 第一步,我们定义一个枚举: /// <summary> ...
- hihocoder 1391 [扫描线]
/* 题意: 两方对阵,互发导弹.防护罩可以让导弹原速反向. 每一枚导弹有发射时间航行时间伤害值. 防护罩也有开启时间和防御时间. 其中一方防护罩开启时间已知,求另一方防护罩合理安排开启时间使得己方受 ...
- 【原】搭建Samba的简要过程
1.安装samba yum install samba –y 2.创建用户 useradd admin #先创建系统用户 smbpasswd -a admin #第一次加入需要-a参数,把admin用 ...
- iOS开发--应用设置及用户默认设置【2、读取应用中的设置】
在上一节中,我们通过探讨应用的系统设置的基本功能,了解运用bundle捆绑包以及plist文件的基本开发.用户能够使用设置应用来声明他们的偏好设置,那么我们怎样去调用用户所设置的参数呢 ...
- mvc之页面强类型
为什么使用页面强类型: 一个页面只能定义 为一个强类型.因为 我们自己写@Html.TextBox("Qq"); 有可能写错,所以我们就在 编译阶段就把页当作一个类型然后使用lam ...