linux目录操作函数[转UC]

转自:
http://blog.chinaunix.net/u2/63316/showart_547992.html


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值