目錄操作有關的函式在dirent.h中宣告。
它們使用乙個名為dir的的結構作為目錄操作的基礎。使用目錄流的指標(dir *)完成各種目錄操作,使用和file *類似。
目錄資料項本身在dirent結構中返回,dirent結構也宣告在dirent.h中。
使用到的函式:
man opendir,檢視具體資訊。
函式原型:
/*
函式功能:開啟乙個目錄並建立乙個目錄流。
引數:name--目錄位置
返回值:成功--返回乙個指向dir結構的指標,該指標用於讀取目錄資料項。
失敗--返回乙個空指標。
*/#include
#include
dir *
opendir
(const
char
*name)
;
函式原型:
#include
struct dirent *
readdir
(dir *dirp)
;
#include
#include
intclosedir
(dir *dirp)
;
struct _dirstream ;typedef struct _dirstream dir;
struct dirent要想輸出類似於ls -l那麼詳細的資訊,只依靠struct dirent是不夠的:
strcut stat
struct passwd ;
struct group乙個簡單的ls程式:;
/*
myls實現的簡單功能:
myls 預設輸出當前目錄下的檔案
myls -d dir 輸出dir目錄下的檔案
myls -a -d dir 輸出dir目錄下所有檔案
myls -l -d dir 輸出dir目錄下檔案的詳細資訊
*/#include
/*《unix環境高階程式設計》作者對常用函式等的封裝*/
#include
#include
#include
#include
#include
#include
#include
#include
void
printdir
(const
char
* d_name)
;void
mode2string
(int st_mode,
char
*str)
;char
*uid2name
(uid_t uid)
;char
*gid2name
(gid_t did)
;char
*time2string
(time_t time)
;int printall, printdetail;
/*列印標誌*/
intmain
(int argc,
char
*ar**)
}/*開啟目錄*/if(
(dp =
opendir
(curdir))==
null
)err_sys
("can't open %s"
, ar**[1]
);/*改變當前工作目錄*/
chdir
(curdir)
;/*讀取目錄項*/
while
((dirp =
readdir
(dp))!=
null
)/*關閉目錄*/
closedir
(dp)
;return0;
}void
printdir
(const
char
* d_name)
/*忽略隱藏檔案*/
if(d_name[0]
=='.')}
/************************/
/*根據檔名獲取檔案屬性*/
/************************/if(
0==lstat
(d_name,
&statbuf)
)else
}else
}void
mode2string
(int st_mode,
char str)
elseif(
s_isdir
(st_mode)
)elseif(
s_islnk
(st_mode)
)/*使用者許可權位*/
if(st_mode & s_irusr)
str[1]
='r';if
(st_mode & s_iwusr)
str[2]
='w';if
(st_mode & s_ixusr)
str[3]
='x'
;/*組許可權位*/
if(st_mode & s_irgrp)
str[4]
='r';if
(st_mode & s_iwgrp)
str[5]
='w';if
(st_mode & s_ixgrp)
str[6]
='x'
;/*其它組許可權位*/
if(st_mode & s_iroth)
str[7]
='r';if
(st_mode & s_iwoth)
str[8]
='w';if
(st_mode & s_ixoth)
str[9]
='x';}
char
*uid2name
(uid_t uid)
char
*gid2name
(gid_t gid)
char
*time2string
(time_t time)
檔案沒有排序,輸出字段間隔也沒調好。。。支援選項不多。。。
[root@20:26
:251-
4]$.
/myls -l -a -d /root
-rw-r--r--
1 root root 427480b fri jun 2613:
50:092020 unpv13e.tar.gz
-rw-r--r--
1 root root 147b thu mar 1214:
40:022020 variable.cpp
-rw-r--r--
1 root root 18b fri aug 1811:
52:032017
.bash_logout
drwxr-xr-x 2 root root 4096b fri aug 1812:
00:322017
.pip
-rw--
----
-1 root root 102b mon may 2513:
06:442020
.rediscli_history
-rw-r--r--
1 root root 4678b sat jul 1118:
01:292020 netopeer-manager.txt
drwxr-xr-x 7 root root 4096b sun jul 512:
33:562020 netconf
drwx--
----
2 root root 4096b sun jul 512:
58:382020
.ssh
-rw-r--r--
1 root root 0b thu mar 1214:
42:532020 sales_item.cpp
-rw-r--r--
1 root root 1512b wed jun 321:
05:592020 passwd
-rw-r--r--
1 root root 92830b sun mar 2910:
14:132020 src.
3e.tar.gz
-rw-r--r--
1 root root 100b fri aug 1811:
52:032017
.cshrc
簡單實現ls命令
include include include include include include include include include include int aflag,lflag typedef struct node linknode,linklist void display fil...
Linux基礎 ls功能的簡單實現
簡單的ls實現,首先,我們需要遍歷引數目錄下的各個檔案,再根據檔案相應的性質,讀取檔案的許可權,使用者組,使用者名稱,大小,最後一次訪問的時間,再根據檔名排序後依次顯示。具體的函式宣告如下 1 include 2 include 3 include 4 include 5 include 6 inc...
ls命令簡單實現 目錄讀寫
unix linux中的目錄讀寫,類似於檔案讀寫,使用系統呼叫opendir開啟,readdir將檔案的一些資訊寫入乙個結構體中。man k direct grep read 出現系統呼叫readdir read a directory entry 檢視檔案記錄 大概是我們想要的。man readd...