linux目录操作函数


 

 

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 编程基础的书来看.

 

 

  

相关内容

    暂无相关文章