在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字元 */
}
在本程式碼中也用到了
然後基礎的知識大體上就是這麼多了,剩下的就是實現 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:可以將目錄下的全部檔案
Linux下用c語言實現發送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
Linux下用c語言實現傳送http請求 方式可以Get或者Post例程參考
[1].[程式碼] Linux下用c語言實現傳送http請求 方式可以Get或者Post 跳至 [1] ? 1 2
Linux下用c語言實現傳送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 是一個字串陣列
學習筆記:windows下,用c語言來建立執行緒
#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