LINUX下历遍目录的方法一般是这样的
创新互联是一家专注于成都网站制作、成都网站设计、外贸营销网站建设与策划设计,彭山网站建设哪家好?创新互联做网站,专注于网站建设十余年,网设计领域的专业建站公司;建站业务涵盖:彭山等地区。彭山做网站价格咨询:028-86922220
打开目正唤录-》读取-》关闭目录
相关函数是
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);
好了,三个函数都出来了呵呵,原型就是上面,给自己解释一下免得以后我自己忘了呵呵!我以经忘过好几回了,所以这次放上博客来
opendir用于打开目录,是类似于流的那种方式,返回一个指向DIR结构体的指针他的参数*dirname是一个字符数组或者字符串常量,
readdir函数用于读取目录,他只有一个参数,这个参数主opendir返回的结构体指针,或者叫句柄更容易理解些吧。这个函数也返回一个结构体指针 dirent *
dirent的结构如下定义
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) */
}
结构体中d_ino存放的是该文件的结点数目,什么是结点数目呢我也说不清楚了呵呵,查一下其它资料了举销凯
d_off 是文件在目录中的编移,具体是什么意思我也不是很明白,我很少用到它,其本上就是用到d_name short d_reclen是这个文件的长度,需要注意的是这里的长度并不是指文件大小,因为大小和长度是2回事了,你可以用lseek将文件长度移得很长,但大小其实还是那么大.最后一个元素就是我们要的了,文件名称!
写了一个实例:
/**
* 功能: Linux下C语言目录历遍 (读取目录斗芦)
* 作者: 小徐
* 邮箱: xjtdy888@163点抗
* QQ: 339534039
* 转载请注明出处
*/
#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执行下面的命令进行编译测试
[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 ~]#
程序正常执行!到此完了呵呵!!
opendir和readdir的原理决定的
你可以认为 opendir后 打开的是一个文件夹,这个文件夹指向一个结构体
也就是返回的dp
而dp里面有一厅隐慎个链表,或者数组
每次readdir就把这个数据向前移动一位,并返回当前文件节点dirp
等这个链表 移动到尾部携唯,就是返回扮敬NULL,这时就代表遍历结束了。
Linux下清除磁盘分区及残留raid信息
适用场景:
1、 查看硬盘编号
2、 删除磁盘分区
3、 删除磁盘内残留raid信息
*本文适用于430-8i等只有低速格式化或没有格式化功能的HBA卡使用,若raid卡有格式芹睁化功能,建议使用raid卡格式化解决问题。
一、查看硬盘编号
适用lsblk命令可以查看当先系统下的磁盘相关信息及磁盘大小
sda为硬盘为系统内的第一个硬盘
sda1为该硬盘下的第一个分区以此类扮首亩推
二、删除磁盘分区
三、删除磁盘内残留raid信息
如果磁盘在其他raid卡中做过raid,在430-8i这类没有格式化功能的HBA卡中使用时,使用parted等相关命令无法将raid残留信息删除导致无法分区正常安装系统。
现象如厅森下:
Raid卡残留信息的type为dmraid分区名称以`-ddf_开头
删除方法如下:
整体思路是通过dd命令将残留信息所在扇区置零
通常raid卡的信息会放在最后一个柱面即最后63个扇区
以sda为例:
发现有dpIBM等信息,为残留的raid信息
再打印发现已经置零,清除成功。
重启节点重新加载linux中才会生效
同时打开两个或者多个文件,进行比较。
vimdiff会将两个文件的相同指出尽量列在同一位置上面,便于查对比较。其命令基本和vim是一致的。
vimdiff使用vim启动两个或者多个文件,每个文件有其自己的窗口。每个文件中不同的地方会用高亮显示出来。它在进行改变的检查以及将改动从一个版本的文件移动到另一个版本的情况下非常方便。首先你得保证安装了vim才能是用vimdiff.用这个命令安装:
其他类似的工具还tkdiff,meld 和 xfdiff4等。
或
这样会同时打开两个文件垂直在两栏显示,可以打开不止两个文件。
这样会同时打开两个文件在上下两栏显示.
可以看见不同的地方会高亮显示,相同的地方默认会被折叠起来。
如下常用操作:
输入"]c".
输入"[c".
输入"do".
这里,前提是用']c'或者'[c'跳到相应的不同处,执行完毕之后,当前窗口当前位置内容被替换为另外一个窗口的当前位置内容。注意这里是两个文件的情况,当前窗口有多于两个文件时无法进行缺竖梁。
输入"1,100 diffg".
或输入"1,100 diffget".
这里,等同于do不过指定了范伏运围,如果有缓冲还可在diffg后面指定缓冲名字。
输入"1,100 diffg 3".
或输入"1,100 diffget 3".
这里,在diffg后面指定缓冲名字。
输入"dp".
这里,前提是用']c'或者'[c'跳到相应的不同处,执行完毕之后,纤备另外一个窗口的当前位置内容被替换成当前窗口当前的位置内容。注意这里是两个文件的情况,当前窗口有多于两个文件时无法进行。
输入"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".
这里,当我们修改某一个文件的时候,vim会试图使它和另外一个文件的不同之处保持更新,例如插入和删除行。但是,更复杂的修改或者在一个行内的修改可能会导致不同处(vimdiff)没有及时更新,这时候可以运行这个命令(diffupdate)进行强制更新。
输入":set diffopt=context:3".
这里vimdiff 缺省是会把不同之处上下各 6 行的文本都显示出来以供参考。其他的相同的文本行被自动折叠。如果希望修改缺省的上下文行数,可以这样设置.
输入"zo".
输入"zc".
输入"wqa".
其实vimdiff就是vim,只是一个符号链接而已,你可以file /etc/alternatives/*|grep bin/vim看看。
参考资料: