c语言之ls目录的简单实现和window版本dirent.h
2016-08-25 22:04
393 查看
#include <stdio.h> #if _WIN32 #include <Windows.h> #include <io.h> #include "dirent.h" #else #include <unistd.h> #include <dirent.h> #endif //window 下载http://www.softagalleria.net/download/dirent/dirent-1.21.zip int main(int argc, char *argv[]) { DIR *dir; struct dirent* mydirent; if(argc!=2) { printf("usage:directory_name"); return -1; } if((dir=opendir(argv[1]))!=NULL) { while((mydirent=readdir(dir))!=NULL) { printf("%s \n",mydirent->d_name); } }else{ printf("cannot open %s",argv[1]); return -1; } closedir(dir); return 0; }
/*
* An example demonstrating recursive directory traversal.
*
* Compile this file with Visual Studio 2008 project vs2008.sln and run
* the produced command in console with a directory name argument. For
* example, command
*
* find "C:\Program Files"
*
* might produce a listing with thousands of entries such as
*
* c:\Program Files/7-Zip/7-zip.chm
* c:\Program Files/7-Zip/7-zip.dll
* c:\Program Files/7-Zip/7z.dll
* c:\Program Files/Adobe/Reader 10.0/Reader/logsession.dll
* c:\Program Files/Adobe/Reader 10.0/Reader/LogTransport2.exe
* c:\Program Files/Windows NT/Accessories/wordpad.exe
* c:\Program Files/Windows NT/Accessories/write.wpc
*
* The find command provided by this file is only an example. That is,
* the command does not provide options to restrict the output to certain
* files as the Linux version does.
*
* Copyright (C) 2006-2012 Toni Ronkko
* This file is part of dirent. Dirent may be freely distributed
* under the MIT license. For all details and documentation, see
* https://github.com/tronkko/dirent */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
static int find_directory (const char *dirname);
int
main(
int argc, char *argv[])
{
int i;
int ok;
/* For each directory in command line */
i = 1;
while (i < argc) {
ok = find_directory (argv[i]);
if (!ok) {
exit (EXIT_FAILURE);
}
i++;
}
/* List current working directory if no arguments on command line */
if (argc == 1) {
find_directory (".");
}
return EXIT_SUCCESS;
}
/* Find files and subdirectories recursively */
static int
find_directory(
const char *dirname)
{
DIR *dir;
char buffer[PATH_MAX + 2];
char *p = buffer;
const char *src;
char *end = &buffer[PATH_MAX];
int ok;
/* Copy directory name to buffer */
src = dirname;
while (p < end && *src != '\0') {
*p++ = *src++;
}
*p = '\0';
/* Open directory stream */
dir = opendir (dirname);
if (dir != NULL) {
struct dirent *ent;
/* Print all files and directories within the directory */
while ((ent = readdir (dir)) != NULL) {
char *q = p;
char c;
/* Get final character of directory name */
if (buffer < q) {
c = q[-1];
} else {
c = ':';
}
/* Append directory separator if not already there */
if (c != ':' && c != '/' && c != '\\') {
*q++ = '/';
}
/* Append file name */
src = ent->d_name;
while (q < end && *src != '\0') {
*q++ = *src++;
}
*q = '\0';
/* Decide what to do with the directory entry */
switch (ent->d_type) {
case DT_LNK:
case DT_REG:
/* Output file name with directory */
printf ("%s\n", buffer);
break;
case DT_DIR:
/* Scan sub-directory recursively */
if (strcmp (ent->d_name, ".") != 0
&& strcmp (ent->d_name, "..") != 0) {
find_directory (buffer);
}
break;
default:
/* Ignore device entries */
/*NOP*/;
}
}
closedir (dir);
ok = 1;
} else {
/* Could not open directory */
printf ("Cannot open directory %s\n", dirname);
ok = 0;
}
return ok;
}
/* * An example demonstrating basic directory listing. * * Compile this file with Visual Studio 2008 project vs2008.sln and run the * produced command in console with a directory name argument. For example, * command * * ls "c:\Program Files" * * might output something like * * ./ * ../ * 7-Zip/ * Internet Explorer/ * Microsoft Visual Studio 9.0/ * Microsoft.NET/ * Mozilla Firefox/ * * The ls command provided by this file is only an example. That is, the * command does not have any fancy options like "ls -al" in Linux and the * command does not support file name matching like "ls *.c". * * Copyright (C) 2006-2012 Toni Ronkko * This file is part of dirent. Dirent may be freely distributed * under the MIT license. For all details and documentation, see * https://github.com/tronkko/dirent */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <dirent.h> static void list_directory (const char *dirname); int main( int argc, char *argv[]) { int i; /* For each directory in command line */ i = 1; while (i < argc) { list_directory (argv[i]); i++; } /* List current working directory if no arguments on command line */ if (argc == 1) { list_directory ("."); } return EXIT_SUCCESS; } /* * List files and directories within a directory. */ static void list_directory( const char *dirname) { DIR *dir; struct dirent *ent; /* Open directory stream */ dir = opendir (dirname); if (dir != NULL) { /* Print all files and directories within the directory */ while ((ent = readdir (dir)) != NULL) { switch (ent->d_type) { case DT_REG: printf ("%s\n", ent->d_name); break; case DT_DIR: printf ("%s/\n", ent->d_name); break; case DT_LNK: printf ("%s@\n", ent->d_name); break; default: printf ("%s*\n", ent->d_name); } } closedir (dir); } else { /* Could not open directory */ printf ("Cannot open directory %s\n", dirname); exit (EXIT_FAILURE); } }
源码:
window下载http://www.softagalleria.net/download/dirent/dirent-1.21.zip
相关文章推荐
- 用libev的c语言版本实现简单的网络通信服务器
- 比之前那个版本更简单的C语言实现的比较大小
- Linux系统编程_1_目录读取(实现简单ls命令)
- Window下使用C语言实现目录的遍历
- 【c语言】通讯录的简单实现文件版本(动态开辟内存)
- 用libev的c语言版本实现简单的网络通信服务器
- 比之前那个版本更简单的C语言实现的比较大小
- linux ls命令的的简单实现APUE-1.4 文件和目录
- linux下用c语言实现ls -l 对文件或者目录的属性遍历
- 笔记1-1: 实现一个简单的ls列出目录中的所有项目的程序
- 用libev的c语言版本实现简单的网络通信服务器
- Linux命令实现(3) 简单的ls
- C语言实现一个简单的单向链表list
- 学生信息管理系统简单模拟(C语言实现)
- 一个简单的树型目录实现
- 文件加密的简单实现(C语言)
- C语言简单数据缓存实现
- 一个简单的HashMap C语言实现
- 用C语言实现简单密码输入(初稿)
- 最简单的win32程序(c语言实现)