发布时间:2014-09-05 17:09:02作者:知识屋
linux目录操作函数
Linux下的目录是依照标准来实作的,因此,您可以毫无问题地移殖到任何其它UNIX平台。
--------------------------------------------------------------------------------
getcwd/getwd : 取得目前所在目录
--------------------------------------------------------------------------------
#include
char * getcwd(char *buf,size_t size);
buf将会返回目前路径名称。
任何的错误发生,将会返回NULL。如果路径长度超过size,errno为ERANGE。getcwd返回的值永远是没有symbol link的。
--------------------------------------------------------------------------------
#include
char *getwd(char *buf);
getwd是个危险的函数,一般都会强烈建议不要用,因为您无法确定最长的目录长度为多少。PATH_MAX定义了最长的路径长度。在Linux下所以提供这个函数主要是因为「传统」。
--------------------------------------------------------------------------------
//获取系统目录最大长度
long pathconf(char* path, int flag);
--------------------------------------------------------------------------------
chdir/fchdir/chroot : 改变目前所在目录
--------------------------------------------------------------------------------
#include
int chdir(const char * pathname);
int fchdir(int fd);
chdir根据pathname变更目前的所在目录,它只改变该程式的所在目录。
fchdir根据已开启的fd(file descriptor)目录来变更。
//sample
/*更改当前工作目录到上级目录*/
if(chdir("..")==-1){
perror("Couldn't change current working directory./n");
return 1;
}
--------------------------------------------------------------------------------
#include
int chroot(const char * path);
chroot改变该程式的根目录所在。例如chroot("/home/ftp")会将根目录换到/home/ftp下,而所有档案操作都不会超出这个围内。为保障安全性,当chdir("/..")时,将会仅切换到chdir("/"),如此便不会有档案安全问题。
--------------------------------------------------------------------------------
mkdir/rmdir : 造/移除目录
--------------------------------------------------------------------------------
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char * dirname,mode_t mode);
mkdir会造一个新目录出来,例如mkdir("/home/foxman",0755);。
如果该目录或档案已经存在,则操作失败。
/*mode 设置为0700,开始的0表示八进制*/
if(mkdir("/home/zxc/z", 0700) == -1){
perror("Couldn't create the directory./n");
return 1;
}
--------------------------------------------------------------------------------
#include <unistd.h>
int rmdir(char * pathname);
这个函数移除pathname目录。
--------------------------------------------------------------------------------
//获得文件信息
#include <sys/types.h> <sys/stat.h> <unistd.h>
int stat(const char* path, struct stat* buf);
int fstat(int filedes, struct stat* buf);
int lstat(const char* path, struct stat* buf);
opendir/readdir/closedir/rewinddir : 读取目录资讯
--------------------------------------------------------------------------------
#include
DIR * opendir(const char * pathname);
int closedir(DIR *dir);
struct dirent * readdir(DIR *dir);
int rewinddir(DIR *dir);
struct dirent {
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name [NAME_MAX+1]; /* file name (null-terminated) */
};
opendir开启一个目录操作DIR,closedir关闭之。
readdir则循序读取目录中的资讯,rewinddir则可重新读取目录资讯。
以下是个标准例。
--------------------------------------------------------------------------------
#include <sys/types.h>
#include <direct.h>
char ** dirGetInfo(const char *pathname)
{
char ** filenames;
DIR * dir;
struct dirent * ent;
int n = 0;
filenames = (char **)malloc(sizeof(char*));
filenames[0]=NULL;
dir = opendir(pathname);
if (!dir) return filenames;
while ((ent = readdir(dir))) {
filenames = (char**)realloc(filenames,sizeof(char*)*(n+1));
filenames[n] = strdup(ent->d_name);
n++;
}
closedir(dir);
filenames = (char **)realloc(filenames,sizeof(char*)*(n+1));
filenames[n] = NULL;
return filenames;
}
c语言实现目录遍历
思路:
采用深度遍历算法,进行目录遍历.
#include <direct.h> //use _chdir() and _getcwd() function
#include <stdio.h>
#include <io.h> //use _findfirst() and findnext() function
#define _MAXPATH 256
void view();
int main()
{
char filename[128];
printf("input path/n");
gets(filename);
_chdir(filename); //进入目录
view();
return 0;
}
void view()
{
struct _finddata_t file; //定义结构体变量
long handle;
char path[_MAXPATH]; //路径
handle=_findfirst("*",&file);//查找所有文件
if(handle==-1)/*如果handle为-1, 表示当前目录为空, 则结束查找而返回
如果handle为-1, 表示当前目录为空, 则结束查找而返回*/
return ;
else
{
if(file.attrib &_A_SUBDIR ) //是目录
{
if(file.name[0]!='.') //文件名不是'.'或'..'时
{
_chdir(file.name); //进入该目录
_getcwd(path,_MAXPATH) //获得目录路径
puts(path); //输出目录路径
view();//继续遍历
_chdir("..");/*查查找完毕之后, 返回上一级目录找完毕之后, 返回 上一级目录*/
}
}
else //// 如果第一个实体不是目录,显示该文件
{
_getcwd(path,_MAXPATH);
// 再获得文件的完整的路径名(包含文件的名称)
strcat(path,"//");
strcat(path,file.name);
printf("%-20s 9ld/n",path,file.size);
}
// 继续对当前目录中的下一个子目录或文件进行与上面同样的查找
while(!(_findnext(handle,&file))
{
if(file.attrib &_A_SUBDIR) //是目录
{
if(file.name[0]!='.') //文件名不是'.'或'..'时
{
_chdir(file.name); //进入该目录
_getcwd(path,_MAXPATH) //获得目录路径
puts(path); //输出目录路径
view();//继续遍历
_chdir("..");/*查查找完毕之后, 返回上一级目录找完毕之后, 返回 上一级目录*/
}
}
else //// 如果第一个实体不是目录,显示该文件
{
_getcwd(path,_MAXPATH);
// 再获得文件的完整的路径名(包含文件的名称)
strcat(path,"//");
strcat(path,file.name);
printf("%-20s 9ld/n",path,file.size);
}
}
_findclose(handle);
}
这样我们就可以对整个目录进行遍历搜索,并输出显示其完整的文件路径。以上的程序在Visual C++6.0中已调试通过。
#include <dirent.h>
#include <stdio.h>
int main()
{
DIR *dir;
struct dirent *subfile;
dir = opendir(".");
while ((subfile = readdir(dir)) != NULL) {
printf("%s/n", subfile->d_name);
}
return 0;
}
UNIX: lstat,readdir,opendir
win32: findfirst,findnext
这个头文件中的函数只不过提供了简单的文件目录服务而已
使用文件目录服务和学操作系统编程是两码事
你要使用文件目录服务根本不需要从新编写文件系统, 也不必要换操作系统
因为无论哪个操作系统都会提供文件目录编程接口
windows 下需要文件目录服务时一般是使用Win API ( 当然,也可以使用 文件系统API 的某个封装). 简单的文件目录服务可以用C 运行时库函数
windows 下和 文件目录服务 有关的C 运行时库函数 的声明 一般 在direct.h 和io.h 中.比如linux 平台下的opendir 就可以用dev c++ 的头文件io.h 中的函数chdir 与direct.h 中的_chdrive 替代.
如果想使用Win API 来访问文件目录服务, 你应该先去找本Windows 编程基础的书来看.
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能