天天看點

使用linux-c程式設計實作簡單的ls指令

具體代碼如下: 

    加載的頭檔案有stdio.h,sys/types.h,dirent.h,unistd.h,sys/stat.h,fcntl.h,string.h等。 

<code>void</code> <code>main(</code><code>int</code> <code>argc,</code><code>char</code> <code>**argv){ </code>

<code>    </code><code>DIR *dir; </code>

<code>    </code><code>struct</code> <code>dirent *rdir; </code>

<code>    </code><code>struct</code> <code>stat statbuf; </code>

<code>    </code><code>char</code> <code>* buffer=”/”; </code>

<code>    </code><code>char</code> <code>*file_; </code><code>char</code> <code>*p; </code>

<code>    </code><code>int</code> <code>lenght=</code><code>strlen</code><code>(argv[argc-1]);</code>

<code>    </code><code>int</code> <code>len=argc; </code>

<code>    </code><code>char</code> <code>parameter[]={‘i’,’t’,’a’,’u’,’g’,’b’,’s’}; </code><code>//參數屬組 </code>

<code>    </code><code>if</code><code>(argc==1 ||</code><code>strstr</code><code>(argv[argc-1],buffer)==NULL){ </code>

<code>        </code><code>argv[argc++]=”./”; </code>

<code>        </code><code>dir=opendir(“./”); </code><code>//打開目錄檔案 </code>

<code>    </code><code>}</code><code>else</code><code>{ </code>

<code>        </code><code>dir=opendir(argv[argc-1]);</code>

<code>        </code><code>file_=argv[argc-1]; </code><code>//打開目錄檔案 </code>

<code>    </code><code>} </code>

<code>    </code><code>while</code><code>((rdir=readdir(dir))!=NULL){ </code><code>//讀取目錄中的目錄或者檔案 </code>

<code>        </code><code>if</code><code>(len!=argc){ </code>

<code>            </code><code>file_=rdir-&gt;d_name; </code><code>//從struct dirent結構取出檔案名稱 </code>

<code>        </code><code>}</code><code>else</code><code>{ </code>

<code>            </code><code>p=rindex(file_,’/’); </code>

<code>            </code><code>if</code><code>(</code><code>strlen</code><code>(p)!=1){ </code>

<code>                </code><code>strcat</code><code>(file_,buffer); </code>

<code>            </code><code>} </code>

<code>            </code><code>strcat</code><code>(file_,rdir-&gt;d_name); </code>

<code>        </code><code>} </code>

<code>        </code><code>int</code> <code>file=open(file_,O_RDONLY,0); </code><code>//打開檔案 </code>

<code>        </code><code>stat(file_,&amp;statbuf); </code><code>//通過stat函數讀取檔案的狀态資訊放在struct stat 這個結構體中,這個結構包含檔案的屬組,屬主,權限,時間戳,檔案大小等。</code>

<code>      </code><code>int</code> <code>tmp=1;</code>

<code>      </code><code>while</code><code>(tmp&lt;argc){</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[0])!=NULL){</code>

<code>             </code><code>printf</code><code>(</code><code>"%10d"</code><code>,rdir-&gt;d_ino);</code>

<code>        </code><code>}</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[1])!=NULL){</code>

<code>              </code><code>printf</code><code>(</code><code>"%10d"</code><code>,statbuf.st_atime);</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[2])!=NULL){</code>

<code>              </code><code>printf</code><code>(</code><code>"%20d"</code><code>,statbuf.st_atime);</code>

<code>             </code><code>printf</code><code>(</code><code>"%10d"</code><code>,statbuf.st_uid);</code>

<code>             </code><code>printf</code><code>(</code><code>"%10d"</code><code>,statbuf.st_gid);</code>

<code>            </code><code>printf</code><code>(</code><code>"%10d"</code><code>,statbuf.st_blocks);</code>

<code>            </code><code>printf</code><code>(</code><code>"%10d"</code><code>,statbuf.st_size);</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[3])!=NULL){</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[4])!=NULL){</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[5])!=NULL){</code>

<code>        </code><code>if</code><code>(rindex(argv[tmp],parameter[6])!=NULL){</code>

<code>        </code><code>tmp++;</code>

<code>    </code><code>}</code>

<code>    </code><code>close(file);      </code><code>//關閉打開的檔案</code>

<code>    </code><code>if</code><code>(len!=argc){</code>

<code>        </code><code>int</code> <code>j=</code><code>strlen</code><code>(file_);</code>

<code>        </code><code>while</code><code>(j&gt;=lenght){</code>

<code>            </code><code>file_[j--]=NULL;</code>

<code>    </code><code>printf</code><code>(</code><code>"%20s\n"</code><code>,rdir-&gt;d_name);</code>

<code>    </code><code>closedir(dir);     </code><code>//關閉打開的目錄</code>

<code>}</code>

/* 

<code>struct</code> <code>stat { </code>

<code>mode_t st_mode; </code><code>//檔案對應的模式,檔案,目錄等 </code>

<code>ino_t st_ino; </code><code>//inode節點号 </code>

<code>dev_t st_dev; </code><code>//裝置号碼 </code>

<code>dev_t st_rdev; </code><code>//特殊裝置号碼 </code>

<code>nlink_t st_nlink; </code><code>//檔案的連接配接數 </code>

<code>uid_t st_uid; </code><code>//檔案所有者 </code>

<code>gid_t st_gid; </code><code>//檔案所有者對應的組 </code>

<code>off_t st_size; </code><code>//普通檔案,對應的檔案位元組數 </code>

<code>time_t</code> <code>st_atime; </code><code>//檔案最後被通路的時間 </code>

<code>time_t</code> <code>st_mtime; </code><code>//檔案内容最後被修改的時間 </code>

<code>time_t</code> <code>st_ctime; </code><code>//檔案狀态改變時間 </code>

<code>blksize_t st_blksize; </code><code>//檔案内容對應的塊大小 </code>

<code>blkcnt_t st_blocks; </code><code>//偉建内容對應的塊數量 </code>

<code>};</code>

<code>struct</code> <code>drient {</code>

<code>   </code><code>long</code> <code>d_ino;  索引節點号 </code>

<code>   </code><code>off_t d_off;  在目錄檔案中的偏移 </code>

<code>   </code><code>unsigned </code><code>short</code> <code>d_reclen; 檔案名長 </code>

<code>   </code><code>unsigned </code><code>char</code> <code>d_type; 檔案類型 </code>

<code>   </code><code>char</code> <code>d_name [NAME_MAX+1];  檔案名,最長255字元 </code>

<code>int</code> <code>stat(</code><code>const</code> <code>char</code> <code>*path, </code><code>struct</code> <code>stat *struct_stat);</code>

<code>int</code> <code>lstat(</code><code>const</code> <code>char</code> <code>*path,</code><code>struct</code> <code>stat *struct_stat);</code>

<code>還有一個fstat函數。</code>

兩個函數的第一個參數都是檔案的路徑,第二個參數是struct stat的指針。傳回值為0,表示成功執行。 

*/

本文轉自lnsaneLlinux部落格51CTO部落格,原文連結http://blog.51cto.com/lnsane784/1930437如需轉載請自行聯系原作者

Insane_linux

繼續閱讀