簡單的ls程式

2021-10-05 12:44:47 字數 4569 閱讀 9287

目錄操作有關的函式在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...