1. 程式人生 > >在Linux下:用 C 語言實現 ls 命令

在Linux下:用 C 語言實現 ls 命令

這次主要的目的是用 C語言 實現 Linux 系統中的 ls 命令。

在編寫命令之前,需要介紹一下幾個結構體:

第一個 DIR

struct __dirstream
{
    void *__fd;
    char *__data;
    int  __entry_data;
    char *__ptr;
    int __entry_ptr;
    size_t __allocation;
    size_t __size;
    __libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;

然後還有幾個對應的函式:

首先定義一個 DIR 型別的指標變數 DIR *dir;

1.開啟檔案:

DIR *opendir(const char *pathname)
這裡面的引數就是想開啟檔案的路徑名字
例如:dir = opendir(".");//其中 . 表示的是當前目錄

2.關閉檔案:

closedir(dir);
//dir變量表示的是用於開啟檔案的那個變數:

3.讀檔案:

struct dirent *readdir(dir);   
然後這裡面又牽扯到另一個結構體: struct dirent 這個一會兒再說

4.rewinddir

作用:用來設定引數dir目錄流目前的讀取位置為原來開頭的讀取位置,沒有返回值的函式。
—摘自百度百科

void rewinddir(dir);

5.seekdir
作用:用來設定引數 dir 目錄流目前的讀取位置,在呼叫 readdir() 時便從此新位置開始讀取。引數 offset 代表距離目錄檔案開頭的偏移量—摘自百度百科

void seekdir(dir,long offset);  

6.telldir
作用:此函式是一個函式名,作用是用於記錄著一個目錄流的位置。—摘自百度百科
關於 DIR 結構,主要知道這幾個函式就OK了,其實在本程式碼中就只用到了 第一個、第二個和第三個。
下面在來介紹一個結構體:struct dirent

struct dirent
{
   long
d_ino; /* 索引節點號 */ off_t d_off; /*在目錄檔案中的偏移 */ unsigned short d_reclen; /*檔名長 */ unsigned char d_type; /* 檔案型別 */ char d_name [NAME_MAX+1]; /* 檔名,最長255字元 */ }

在本程式碼中也用到了 d_name 這個成員變數
然後基礎的知識大體上就是這麼多了,剩下的就是實現 Linux 系統中 ls 命令程式碼了:
就是用 opendir 函式開啟當前的目錄,然後定義一個struct dirent *rent 指標變數,當進行 readdir 這個讀函式的時候,就將 rent 指標指向讀函式返回的那個指標,然後這裡寫程式碼片`rent-<d_name 就行了,最好closedir(dir); 關閉檔案,這樣就大體上寫好了,但是這個命令執行的是 ls - a 的命令,也就是將所有的檔案以及目錄包括隱藏的檔案也給輸出出來了,我們就可以進行一些修飾的操作,將其顯示 ls 的命令,最好還需要進行排一下序,顯得 ls 命令差不多:

大體上程式碼就寫完了,其實在 Windows 系統下也是可以執行的。
My Code:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include <sys/types.h>
#include <algorithm>
using namespace std;
bool cmp(string a, string b){
    return a < b;
}
int main(){
    //struct __dirstream  typedef struct __dirstream DIR;  
    DIR *dir;
    char str[100];
    string res[100];
    struct dirent *rent;//struct
    dir = opendir(".");
    int cnt = 0;
    while((rent=readdir(dir))){
        strcpy(str, rent->d_name);
        if(str[0] == '.')
            continue;
        if(!str)
            continue;
        //printf("%s  ", str);
        res[cnt++] = str;
    }
    //cout<<"cnt = "<<cnt<<endl;
    sort(res, res+cnt, cmp);
    for(int i=0; i<cnt; i++)
        cout<<res[i]<<"  ";
    puts("");
    closedir(dir);
    return 0````````

}

windows 系統下的執行截圖:
這裡寫圖片描述

Linux 系統下的執行截圖

這裡寫圖片描述

相關推薦

Linux C 語言實現 ls 命令

這次主要的目的是用 C語言 實現 Linux 系統中的 ls 命令。 在編寫命令之前,需要介紹一下幾個結構體: 第一個 DIR: struct __dirstream { void *__fd; char *__data; in

Linux終端程序c語言實現改變輸出的字的顏色

光標位置 高亮 AI 藍色 屬性 用c語言實現 TE c語言 說明 顏色代碼: 格式: echo "\033[字背景顏色;字體顏色m字符串\033[0m" 例如: echo "\033[41;36m something here \033[0m" 其中41的位置代表

[領卓教育]C語言實現ls以及ls-功能

各位程式設計師在自己的虛擬機器裡一定沒少執行過“ls”這個功能吧,這個程式碼就是實現了ls和ls-l功能,話不多說,上程式碼。 實現程式碼 int process_ls(char * path) { DIR * dirp; struct dire

綜合例項C語言實現一個自定義的shell程式

      一個shell需要實現若干功能,比如解釋執行命令,支援輸入輸出重定向,支援管道,後臺執行程式等。首先對要實現的功能做一個簡要介紹:       (1)輸出重定向:就是把執行某命令後的結果輸出到某個檔案。例如: ls -al > list.txt  

C語言實現ls -l指令

正常情況下我們在作業系統中使用ls -l指令的結果 第一列表示 檔案讀寫許可權 第二列表示 檔案的深度 第三列和第四列分別表示檔案的屬主和屬組 第五列是檔案的大小,以位元組作為單位 第六,七,八列是檔案最後一次修改的時間 最後一列是檔名 程式碼 #inc

課上補做C語言程式設計實現ls命令

課上補做:用C語言程式設計實現ls命令 一、有關ls ls :用來列印當前目錄或者制定目錄的清單,顯示出檔案的一些資訊等。 ls -l:列出長資料串,包括檔案的屬性和許可權等資料 ls -R:連同子目錄一同顯示出來,也就所說該目錄下所有檔案都會顯示出來 ls -a:可以將目錄下的全部檔案

Linuxc語言實現發送http請求 方式可以Get或者Post例程參考

sockaddr select sleep online 創建 線程終止 index -s lse [1].[代碼] Linux下用c語言實現發送http請求 方式可以Get或者Post 跳至 [1] ? 1 2 3 4 5 6 7 8 9 10 11 12 1

Linuxc語言實現傳送http請求 方式可以Get或者Post例程參考

[1].[程式碼] Linux下用c語言實現傳送http請求 方式可以Get或者Post 跳至 [1] ? 1 2

Linuxc語言實現傳送http請求

前言 在linux下,使用socket進行程式設計,需要到伺服器上進行獲取資料,伺服器使用的php程式設計,需要使用http的方式進行獲取資料。 程式碼 #include <stdio.h> #include <string.h&

九之再續教你一步一步c語言實現sift演算法、

                      教你一步一步用c語言實現sift演算法、下作者:July、二零一一年三月十二日出處:http://blog.csdn.net/v_JULY_v。參考:Rob Hess維護的sift 庫環境:windows xp+vc6.0條件:c語

C語言實現將三個數按從大到小輸出。

temp clas 實現 ima 編程 程序 c語言實現 從大到小 code 這個題目用編程來實現非常簡單,由於我在上一篇博客中已經介紹過使用“冒泡排序”的方法。 所以我在這裏直接給出使用“冒泡排序”寫出的代碼: #include<stdio.h> int m

C語言實現將數組A中的內容和數組B中的內容進行交換(數組一樣大)。

image pri 之前 es2017 sys 變量 ret 只需要 題目 之前我們已經完成了對兩個變量內容進行交換的程序,這兩道題目大同小異,不過是將兩數變成了兩數組。 可能我們會想:我們是不是需要第三個數組作為中間變量進行交換操作? 答案是no,我們只需要通過一個循環體

C語言實現輸入一個字元,則輸出它的大小或小寫字元。

題目: 用C語言實現:連續輸入一個大寫字元則輸出它的小寫字元;輸入它的小寫字元則輸出它的大寫字元;輸入數字則不輸出任何。 思路: 題目說輸入字元或數字,輸入的格式不一樣,所以不可以使用scanf()那麼可以用getchar()連續輸入多個字元. 既然是連續輸入,

C語言實現交換兩個數陣列的內容。

1.計算1/1-1/2+1/3…+1/99-1/100的值 2.交換兩個相等大小陣列的內容 3.1-100中的整數,帶9的整數出現的個數? 交換兩個陣列的內容(陣列大小子相同) 程式列印1-100出現9的個數 #include<stdio.h> #in

Linux C語言實現ls -l

Linux下C語言實現ls -l功能 宗旨:技術的學習是有限的,分享的精神是無限的。 需求:用ls -l顯示資料夾下所有的檔案及屬性 分析:1 用ls顯示資料夾下的所有檔案,首先用opendir開啟資料夾,再用readdir讀取資料夾裡面的檔案,最後closedir關閉

Linux程式(C語言實現對檔案的複製

目標: 使用系統呼叫實現cp命令。 原理: 使用系統呼叫open開啟檔案,使用read從檔案讀資料,使用write向檔案寫資料。 傳給可執行程式的引數個數存放在main函式的argc中,引數首地址存放在指標陣列argv中。 我的程式碼: #include <stdio.h&

C語言實現Linux系統的cp指令

在實現cp指令之前,首先先要了解這樣一個概念,我們平時在寫程式碼時 int main() 這個括號裡省略了3個引數。 int main(int argc,char** argv,char** environ) //argc 表示引數的數量 //argv 是一個字串陣列

學習筆記windowsc語言來建立執行緒

#include <stdio.h>#include <windows.h> typedef void * HANDLE;#define SEMAPHORE HANDLE#define THREADHANDLE HANDLE#define THREAD

C語言實現websocket服務器

sockaddr extend ++i set strlen ner ace == perl Websocket Echo Server Demo 背景 嵌入式設備的應用開發大都依靠C語言來完成,我去研究如何用c語言實現websocket服務器也是為了在嵌入式設備中實現一個

C語言實現窗口抖動

clu 變量 win 句柄 span nbsp idt 兩個 spa #include "stdafx.h" #include <stdio.h> #include<Windows.h> int main() { int s