您的位置:首页 > 编程语言 > C语言/C++

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: