LINUX下歷遍目錄的方法一般是這樣的
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計,彭山網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:彭山等地區(qū)。彭山做網(wǎng)站價格咨詢:028-86922220
打開目正喚錄-》讀取-》關(guān)閉目錄
相關(guān)函數(shù)是
opendir - readdir - closedir
#include dirent.h
DIR *opendir(const char *dirname);
#include dirent.h
struct dirent *readdir(DIR *dirp);
#include dirent.h
int closedir(DIR *dirp);
好了,三個函數(shù)都出來了呵呵,原型就是上面,給自己解釋一下免得以后我自己忘了呵呵!我以經(jīng)忘過好幾回了,所以這次放上博客來
opendir用于打開目錄,是類似于流的那種方式,返回一個指向DIR結(jié)構(gòu)體的指針?biāo)膮?shù)*dirname是一個字符數(shù)組或者字符串常量,
readdir函數(shù)用于讀取目錄,他只有一個參數(shù),這個參數(shù)主opendir返回的結(jié)構(gòu)體指針,或者叫句柄更容易理解些吧。這個函數(shù)也返回一個結(jié)構(gòu)體指針 dirent *
dirent的結(jié)構(gòu)如下定義
struct dirent
{
long d_ino; /* inode number */
off_t d_off; /* offset to this dirent */
unsigned short d_reclen; /* length of this d_name */
char d_name [NAME_MAX+1]; /* file name (null-terminated) */
}
結(jié)構(gòu)體中d_ino存放的是該文件的結(jié)點數(shù)目,什么是結(jié)點數(shù)目呢我也說不清楚了呵呵,查一下其它資料了舉銷凱
d_off 是文件在目錄中的編移,具體是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name short d_reclen是這個文件的長度,需要注意的是這里的長度并不是指文件大小,因為大小和長度是2回事了,你可以用lseek將文件長度移得很長,但大小其實還是那么大.最后一個元素就是我們要的了,文件名稱!
寫了一個實例:
/**
* 功能: Linux下C語言目錄歷遍 (讀取目錄斗蘆)
* 作者: 小徐
* 郵箱: xjtdy888@163點抗
* QQ: 339534039
* 轉(zhuǎn)載請注明出處
*/
#include stdio.h
#include stdlib.h
#include sys/types.h
#include unistd.h
#include dirent.h
void print_usage(void);
void print_usage(void)
{
printf("Usage: test dirname\n");
}
int main(int argc,char *argv[])
{
DIR * dp;
struct dirent *filename;
if (argc 2)
{
print_usage();
exit(1);
}
dp = opendir(argv[1]);
if (!dp)
{
fprintf(stderr,"open directory error\n");
return 0;
}
while (filename=readdir(dp))
{
printf("filename:%-10s\td_info:%ld\t d_reclen:%us\n",
filename-d_name,filename-d_ino,filename-d_reclen);
}
closedir(dp);
return 0;
}
將上面代碼保存為readdir.c執(zhí)行下面的命令進行編譯測試
[root@phpos ~]# gcc readdir.c
[root@phpos ~]# ./a.out
Usage: test dirname
[root@phpos ~]# ./a.out /etc/samba/
filename:lmhosts d_info:49296 d_reclen:24s
filename:smb.conf d_info:49825 d_reclen:24s
filename:smbpasswd d_info:49402 d_reclen:24s
filename:.. d_info:47906 d_reclen:16s
filename:secrets.tdb d_info:49812 d_reclen:24s
filename:. d_info:49295 d_reclen:16s
filename:smbusers d_info:49377 d_reclen:24s
[root@phpos ~]# ./a.out /var/
filename:preserve d_info:31971 d_reclen:24s
filename:lock d_info:31966 d_reclen:16s
filename:yp d_info:31976 d_reclen:16s
filename:empty d_info:31962 d_reclen:24s
filename:run d_info:31972 d_reclen:16s
filename:lib d_info:31939 d_reclen:16s
filename:nis d_info:31969 d_reclen:16s
filename:local d_info:31965 d_reclen:24s
filename:spool d_info:31973 d_reclen:24s
filename:tmp d_info:31941 d_reclen:16s
filename:opt d_info:31970 d_reclen:16s
filename:log d_info:31959 d_reclen:16s
filename:crash d_info:31997 d_reclen:24s
filename:.. d_info:2 d_reclen:16s
filename:account d_info:32037 d_reclen:24s
filename:mail d_info:31968 d_reclen:16s
filename:cache d_info:31960 d_reclen:24s
filename:db d_info:31961 d_reclen:16s
filename:. d_info:31938 d_reclen:16s
[root@phpos ~]#
程序正常執(zhí)行!到此完了呵呵!!
opendir和readdir的原理決定的
你可以認為 opendir后 打開的是一個文件夾,這個文件夾指向一個結(jié)構(gòu)體
也就是返回的dp
而dp里面有一廳隱慎個鏈表,或者數(shù)組
每次readdir就把這個數(shù)據(jù)向前移動一位,并返回當(dāng)前文件節(jié)點dirp
等這個鏈表 移動到尾部攜唯,就是返回扮敬NULL,這時就代表遍歷結(jié)束了。
Linux下清除磁盤分區(qū)及殘留raid信息
適用場景:
1、 查看硬盤編號
2、 刪除磁盤分區(qū)
3、 刪除磁盤內(nèi)殘留raid信息
*本文適用于430-8i等只有低速格式化或沒有格式化功能的HBA卡使用,若raid卡有格式芹睜化功能,建議使用raid卡格式化解決問題。
一、查看硬盤編號
適用lsblk命令可以查看當(dāng)先系統(tǒng)下的磁盤相關(guān)信息及磁盤大小
sda為硬盤為系統(tǒng)內(nèi)的第一個硬盤
sda1為該硬盤下的第一個分區(qū)以此類扮首畝推
二、刪除磁盤分區(qū)
三、刪除磁盤內(nèi)殘留raid信息
如果磁盤在其他raid卡中做過raid,在430-8i這類沒有格式化功能的HBA卡中使用時,使用parted等相關(guān)命令無法將raid殘留信息刪除導(dǎo)致無法分區(qū)正常安裝系統(tǒng)。
現(xiàn)象如廳森下:
Raid卡殘留信息的type為dmraid分區(qū)名稱以`-ddf_開頭
刪除方法如下:
整體思路是通過dd命令將殘留信息所在扇區(qū)置零
通常raid卡的信息會放在最后一個柱面即最后63個扇區(qū)
以sda為例:
發(fā)現(xiàn)有dpIBM等信息,為殘留的raid信息
再打印發(fā)現(xiàn)已經(jīng)置零,清除成功。
重啟節(jié)點重新加載linux中才會生效
同時打開兩個或者多個文件,進行比較。
vimdiff會將兩個文件的相同指出盡量列在同一位置上面,便于查對比較。其命令基本和vim是一致的。
vimdiff使用vim啟動兩個或者多個文件,每個文件有其自己的窗口。每個文件中不同的地方會用高亮顯示出來。它在進行改變的檢查以及將改動從一個版本的文件移動到另一個版本的情況下非常方便。首先你得保證安裝了vim才能是用vimdiff.用這個命令安裝:
其他類似的工具還tkdiff,meld 和 xfdiff4等。
或
這樣會同時打開兩個文件垂直在兩欄顯示,可以打開不止兩個文件。
這樣會同時打開兩個文件在上下兩欄顯示.
可以看見不同的地方會高亮顯示,相同的地方默認會被折疊起來。
如下常用操作:
輸入"]c".
輸入"[c".
輸入"do".
這里,前提是用']c'或者'[c'跳到相應(yīng)的不同處,執(zhí)行完畢之后,當(dāng)前窗口當(dāng)前位置內(nèi)容被替換為另外一個窗口的當(dāng)前位置內(nèi)容。注意這里是兩個文件的情況,當(dāng)前窗口有多于兩個文件時無法進行缺豎梁。
輸入"1,100 diffg".
或輸入"1,100 diffget".
這里,等同于do不過指定了范伏運圍,如果有緩沖還可在diffg后面指定緩沖名字。
輸入"1,100 diffg 3".
或輸入"1,100 diffget 3".
這里,在diffg后面指定緩沖名字。
輸入"dp".
這里,前提是用']c'或者'[c'跳到相應(yīng)的不同處,執(zhí)行完畢之后,纖備另外一個窗口的當(dāng)前位置內(nèi)容被替換成當(dāng)前窗口當(dāng)前的位置內(nèi)容。注意這里是兩個文件的情況,當(dāng)前窗口有多于兩個文件時無法進行。
輸入"1,100 diffpu".
或輸入"1,100 diffput".
這里,等同于dp不過指定了范圍,如果有緩沖還可在diffpu后面指定緩沖名字。
輸入"1,100 diffpu 3".
或輸入"1,100 diffput 3".
這里,在diffpu后面指定緩沖名字。
輸入":diffsplit file".
這里新開的窗口是水平排列的,在不同窗口間移動的命令同vim。
輸入"vert diffsplit file".
這里,vert實際是vertical前綴的簡寫。新開的窗口是垂直排列的,在不同窗口間移動的命令同vim。
輸入":diffupdate".
這里,當(dāng)我們修改某一個文件的時候,vim會試圖使它和另外一個文件的不同之處保持更新,例如插入和刪除行。但是,更復(fù)雜的修改或者在一個行內(nèi)的修改可能會導(dǎo)致不同處(vimdiff)沒有及時更新,這時候可以運行這個命令(diffupdate)進行強制更新。
輸入":set diffopt=context:3".
這里vimdiff 缺省是會把不同之處上下各 6 行的文本都顯示出來以供參考。其他的相同的文本行被自動折疊。如果希望修改缺省的上下文行數(shù),可以這樣設(shè)置.
輸入"zo".
輸入"zc".
輸入"wqa".
其實vimdiff就是vim,只是一個符號鏈接而已,你可以file /etc/alternatives/*|grep bin/vim看看。
參考資料: