说明

        在windows与linux跨平台移植C/C++程序中,有一些相同函数名的函数,实际使用存在一定区别,并且由于系统本身也有各种区别,从系统和函数两部分加以对比说明。
        Windows系统为Windows10家庭版,Linux系统为Ubuntu16.04.6服务器版,Windows下使用开发环境为visual studio 2017,Linux下采用VS2017远程调试功能进行测试。

一、Windows和Linux系统机制对比

1.1 Windows和Linux目录结构的对比

        在Windows中有着“磁盘”这一概念,就是我们通常看到的C盘,D盘,E盘等,虽然它们可能是一块物理硬盘通过分区分成了多个虚拟“磁盘”,但在系统看来,不同的磁盘代表着不同的根目录,也就是说Windows目录结构可以这样来表示:

        而Linux有着明确的根目录"/",所有的文件夹都是在这个根目录下的:

1.2 Windows和Linux用户管理的对比

        两个系统还有区别很大的一点是,Windows虽然也支持多用户,但作为个人电脑,一般都是使用一个固定的用户,即使是不同的用户,在根目录下创建文件夹都不受限制(除非关键的系统文件夹可能要求管理员权限才能执行文件操作)。而Linux可能作为服务器系统使用,同时有多个用户使用是很正常的,只要是正常的linux用户(root这个超级用户和一些服务程序所建立的用户就不是正常的linux用户)每个用户在Linux系统的/home文件夹下都有和自己用户名同名的文件夹,基本上进行文件操作时都是在这个同名文件夹下进行,Linux中可以在根目录下创建新的文件夹,但这需要root权限。
        此外Linux对于文件的读写权限还有着更细致的分类,根据要访问的文件/文件夹和当前用户的关系分为了”文件所有者“,”文件用户组“和”其他用户“,如果你所使用的用户创建了一个文件,那么就是文件所有者,如果你使用的用户所在的用户组创建了一个文件,那么你属于文件用户组,除这两种情况外,你使用的用户对于文件就是”其他用户“。(Linux中可以将几个不同用户划分为一个小组,这是为了方便统一的管理,即”用户组“,本篇文章只需要了解这一概念即可,不做深入说明。)
        可以看到,Linux比Windows文件管理要复杂不少,相应地明显提高了安全性,这也是服务器上更多使用Linux系统的原因之一。

1.3 Windows和Linux路径表示方式对比

        C语言中进行文件操作使用路径时,Windows下路径使用双反斜杠\\表示层级,Linux使用正斜杠/表示层级,虽然跨平台移植程序在编译时不会报错,但是错误的路径会导致运行文件操作相关函数执行失败,如找不到路径(在Windows下,据说有的编译器使用正斜杠表示路径也可以正常识别,但保险的办法是用双反斜杠表示)。Windows路径从盘符开始,如C盘下的Windows路径,表示为”C:\\Windows”。Linux下路径根目录为正斜杠”/”,但是Linux的多用户机制,每个用户都有自己的文件夹,且根目录下的其他文件夹存放了Linux系统重要文件,用户文件夹都存放在”/home”下,如在lww用户下有一个mytest文件夹,那么路径为”/home/lww/mytest”。

温馨提示:如果你只是想了解两个系统的不同,下面的部分就不用再看啦

二、几个文件路径操作函数的对比

2.1 access函数查找文件夹是否存在/文件是否有某权限

头文件:
在windows环境下头文件为:
#include <io.h>
在linux环境下头文件为:
#include <unistd.h>
函数原型:
int access(const char* _Filename, int _AccessMode)
功能及返回值:
        该函数功能为确定文件或文件夹的访问权限,如果指定的访问权限有效,则函数返回0,否则返回-1。
参数说明:
_Filename可以是文件路径,也可以是文件夹路径,可以使用绝对路径或相对路径。
_AccessMode表示要验证的文件访问权限,有可读、可写、可执行以及是否存在四种权限, 可以使用 | (位或)来同时验证多个权限,如F_OK|X_OK

_AccessMode含义
F_OK判断是否存在
X_OK文件是否可执行
W_OK文件是否可写
R_OK文件是否可读

备注:
        当Filename表示文件夹路径时仅能查询该路径是否存在,即_AccessMode参数应为F_OK,此外Windows中还可以使用_access函数,使用方法上没有区别。

2.2 mkdir函数创建文件夹

头文件:
windows环境下头文件为:
#include <direct.h>
Linux环境下头文件为:
#include <sys/stat.h>
函数原型:
windows环境下:
int mkdir(const char *_Path)
Linux环境下:
int mkdir(const char *pathname, mode_t mode)
功能及返回值:
        该函数功能为建立一个新的目录,创建成功则返回0,否则返回-1。
参数说明:
_Path 新建文件夹路径,可使用绝对路径,可也用相对路径。
Linux环境下:
*pathname 同样为文件夹路径。
mode 为不同的权限。

mode含义
S_IRWXU00700权限,代表该文件所有者拥有读,写和执行操作的权限
S_IRUSR(S_IREAD)00400权限,代表该文件所有者拥有可读的权限
S_IWUSR(S_IWRITE)00200权限,代表该文件所有者拥有可写的权限
S_IXUSR(S_IEXEC)00100权限,代表该文件所有者拥有执行的权限
S_IRWXG00070权限,代表该文件用户组拥有读,写和执行操作权限
S_IRGRP00040权限,代表该文件用户组拥有可读的权限
S_IWGRP00020权限,代表该文件用户组拥有可写的权限
S_IXGRP00010权限,代表该文件用户组拥有执行的权限
S_IRWXO00007权限,代表其他用户拥有读,写和执行操作的权限
S_IROTH00004权限,代表其他用户拥有可读的权限
S_IWOTH00002权限,代表其他用户拥有可写的权限
S_IXOTH00001权限,代表其他用户拥有执行的权限

        参数可以使用位或的方式叠加,如S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH,或者直接使用数字作为参数,如0777。
备注:
        无论是windows还是Linux创建文件夹时,一定要注意文件夹路径上一层之前的路径全部存在!如在C盘下lww文件夹新建一个mytest文件夹,一定要保证”C:\\lww”这个路径是存在的!此外Linux下还要注意,使用mkdir创建的文件夹在查看其权限时,发现与程序中可能不同,这是由于默认权限的掩码设置问题,详情请参见https://blog.csdn.net/yangzhengquan19/article/details/83055686,简单来说,在执行mkdir之前,最好加上umask(0),重新设置默认掩码即可创建正确的文件夹权限。 此外Windows中还可以使用_mkdir函数,使用方法上没有区别。

2.3 rmdir函数删除文件夹

头文件:
windows环境下头文件:
#include <direct.h>
linux环境下头文件:
#include <dirent.h>
函数原型:
*int rmdir(const char _Path)
功能及返回值:
        函数功能是删除参数指定的文件夹,成功返回0,否则返回-1。
参数说明:
        要删除的文件夹路径,可使用绝对路径,可也用相对路径。
备注:
        在windows环境下也可使用函数_rmdir函数,使用方法没有区别。

Logo

更多推荐