linux下目录扫描的实现
来源:互联网 发布:用户画像数据建模方法 编辑:程序博客网 时间:2024/05/16 15:46
项目中实现了一个目录扫描的函数
#include <stdio.h>
#include <dirent.h>
#include <string.h>
int dir_scan(char *dir);
int main(int argc, char **argv)
{
if(argc != 2){
printf("input the dir which is to be scanned!/n");
return 1;
}
dir_scan(argv[1]);
return 0;
}
int dir_scan(char *dir)
{
DIR *dp;
struct dirent *entry;
char buf[256];
if((dp = opendir(dir)) == NULL){
fprintf(stderr, "cannot open directory: %s/n", dir);
return 1;
}
while((entry = readdir(dp)) != NULL){
if(entry->d_type == DT_DIR){
/*found a directory ,but ignore . and ..*/
if(!strcmp(".", entry->d_name) || !strcmp("..", entry->d_name))
continue;
bzero(buf, sizeof(buf));
snprintf(buf, 255, "%s/%s", dir, entry->d_name);
/*recurse to scan the sub directory*/
dir_scan(buf);
}
else{
printf("fullfilename:%s/%s/n", dir, entry->d_name);
}
}
closedir(dp);
return 0;
}
后来使用多线程,因为readdir并非是线程安全的,所以改用readdir_r重新实现如下:
int dir_scan(char *dir)
{
DIR *dp;
struct dirent entry;
struct dirent *entryPtr;
char buf[256];
int retval = 0;
if((dp = opendir(dir)) == NULL){
fprintf(stderr, "cannot open directory: %s/n", dir);
return 1;
}
retval = readdir_r(dp, &entry, &entryPtr);
while(entryPtr != NULL){
if(entry.d_type == DT_DIR){
/*found a directory ,but ignore . and ..*/
if(!strcmp(".", entry.d_name) || !strcmp("..", entry.d_name)){
retval = readdir_r(dp, &entry, &entryPtr);
continue;}
bzero(buf, sizeof(buf));
snprintf(buf, 255, "%s/%s", dir, entry.d_name);
/*recurse to scan the sub directory*/
dir_scan(buf);
retval = readdir_r(dp, &entry, &entryPtr);
}
else{
printf("fullfilename:%s/%s/n", dir, entry.d_name);
retval = readdir_r(dp, &entry, &entryPtr);
}
}
closedir(dp);
return 0;
}
但是程序当中采用了snprintf()函数,此函数也非线程安全的,此时可以使用vsnprintf(),来代替snprintf()
http://www.ibm.com/developerworks/cn/aix/library/0806_xiazq_thread/index.html
中提到“snprintf(), vsprintf() 都可以说是线程安全的。存在一种例外情况就是,当这些函数执行的时候,如果有其它线程调用 setlocale 函数,那么可能会出现不安全的可能。不过我们通常不会轻易设置 locale 的值”
以下用vsnprintf()来代替snprintf()
#include <stdio.h>
#include <stdarg.h>
int vspf(char *buf, int bufsize, char *fmt, ...)
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt = vsnprintf(buf, bufsize ,fmt, argptr);
va_end(argptr);
return(cnt);
}
此时可以用函数vspf()来代替snprintf(), 参数完全相同
int dir_scan(char *dir)
{
DIR *dp;
struct dirent entry;
struct dirent *entryPtr;
char buf[256];
int retval = 0;
if((dp = opendir(dir)) == NULL){
fprintf(stderr, "cannot open directory: %s/n", dir);
return 1;
}
retval = readdir_r(dp, &entry, &entryPtr);
while(entryPtr != NULL){
if(entry.d_type == DT_DIR){
/*found a directory ,but ignore . and ..*/
if(!strcmp(".", entry.d_name) || !strcmp("..", entry.d_name)){
retval = readdir_r(dp, &entry, &entryPtr);
continue;}
bzero(buf, sizeof(buf));
//snprintf(buf, 255, "%s/%s", dir, entry.d_name);
vspf(buf, 255, "%s/%s", dir, entry.d_name);
/*recurse to scan the sub directory*/
dir_scan(buf);
retval = readdir_r(dp, &entry, &entryPtr);
}
else{
printf("fullfilename:%s/%s/n", dir, entry.d_name);
retval = readdir_r(dp, &entry, &entryPtr);
}
}
closedir(dp);
return 0;
}
多线程还真是个麻烦的主儿~
- linux下目录扫描的实现
- 目录扫描的实现
- Linux下的目录扫描操作函数使用实践
- Linux目录扫描:打印指定目录下的所有文件及目录
- 腾讯面试:Linux下如何扫描目录
- linux扫描目录下所有文件
- Linux中实现一个目录扫描程序
- linux下c/c++实例之七递归扫描目录下的文件
- linux下c/c++实例之七递归扫描目录下的文件
- Windows环境扫描目录下的文件
- C++扫描目录下的文件
- 扫描一个目录下的所有文件
- 扫描目录下所有文件的文件名
- linux下 目录到目录的复制 C语言实现
- linux目录扫描
- C++实现Linux下遍历指定目录下的文件
- linux下实现将某个目录下的 某种 文件链接到另一个目录下
- 扫描目录下所有文件
- Linux内核中的list_for_each_entry
- Android学习笔记(三十):弹出信息-Toast和告警
- vs2005建立数据库连接的混合验证
- github学习笔记
- VMtools简介与安装
- linux下目录扫描的实现
- .net 修改上传图片的宽高
- Propertes文件的读取和保存
- memcached,eAccelerator区别与用途
- Java NIO 在网络编程中的应用
- .net 上传图片
- 自动化测试(Selenium Grid+Java)--Xpath篇
- 让人家复制自己网站信息自动加上网址
- emctl status dbconsole:出现oc4j configration issue