2

我不确定 C 是否可以做到这一点,但我希望我可以制作一个程序来查看目录,并打印出目录的所有内容以及每个文件的文件大小。正如我希望它看起来像这样(可能):

文件名.txt -- 300 字节

文件名2.txt -- 400 字节

文件名3.txt -- 500 字节

等等。

到目前为止,我创建了一个可以打开文件的程序,它会打印字节,但它不会读取整个目录,我必须具体说明我想读取哪个文件..(这不是我想)。

这是我到目前为止所拥有的:

#include <stdio.h>

int main(){
    FILE *fp; // file pointer
    long fileSize;
    int size;

    // opens specified file and reads
    fp = fopen( "importantcommands.txt", "rw" );
    
    if( fp == NULL ){
        printf( "Opening file error\n" );
        return 0;
    }

    // uses fileLength function and prints here
    size = fileLength(fp);
    printf( "\n Size of file: %d bytes", size );

    fclose(fp);

    return 0;
}

int fileLength( FILE *f ){
    int pos;
    int end;

    // seeks the beginning of the file to the end and counts
    // it and returns into variable end
    pos = ftell(f);
    fseek (f, 0, SEEK_END);
    end = ftell(f);
    fseek (f, pos, SEEK_SET);

    return end;
}

请帮忙。

4

6 回答 6

5

C当然可以做到——ls(1)例如,命令可以,而且它是用C编写的。

要遍历目录,可以使用opendir(3)andreaddir(3)函数。不过,让外壳为您做这件事可能更容易。

至于获取文件名,您可以通过将 main 定义为将其作为命令行参数:

int main(int argc, char **argv)

命令行参数将从argv[1].

于 2013-01-28T19:02:44.323 回答
3

看看你是否在手册页opendir() / fdopendir()中使用 linuxreaddir()dirent.h

一个简单的例子:SO Post

DIR *dir;  
struct dirent *ent;
if ((dir = opendir ("c:\\src\\")) != NULL) {
  /* print all the files and directories within directory */
  while ((ent = readdir (dir)) != NULL) {
     printf ("%s\n", ent->d_name);
  }
  closedir (dir);
} 
else {
  /* could not open directory */
  perror ("Could not open directory");
  return EXIT_FAILURE;
}   

您还可以使用fstat()系统调用,它可以填写struct stat 您想要的任何文件。从中stat您可以访问该文件的大小。
请使用这些man页面来帮助您。(几乎)所有与 Linux 相关的东西都有非常好的文档记录。

于 2013-01-28T19:03:16.660 回答
2

要读取目录中的文件列表,请查看opendirreaddir、 closedir for Linux

使用stat获取文件的长度。

这些是Linux的

对于 winodws,请参见http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365200%28v=vs.85%29.asp和链接http://blog.kowalczyk.info/article/8f /Get-file-size-under-windows.html将向您展示如何执行此操作。

于 2013-01-28T19:05:35.840 回答
0

要获取目录中的文件列表,请查找“libc opendir”。要在不打开文件的情况下获取文件的大小,可以使用 fstat。

于 2013-01-28T19:03:12.460 回答
0

对于给定的示例(在 Linux 或其他 UNIX 下),需要注意的事项很少。

  1. 您只想打印出常规文件的文件名和大小。用于S_ISREG()测试st_mode字段
  2. 如果您还想递归打印子目录下的所有文件,则需要使用S_ISDIR()测试目录并注意特殊目录'.' and '..'
于 2013-01-30T23:40:45.900 回答
0

这似乎与我最近看到的另一个问题奇怪地相似。无论如何,这是我奇怪的相似答案(对于 Linux,不确定它在 Windows 7 上的表现如何):

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {
    struct stat file_stats;
    DIR *dirp;
    struct dirent* dent;

    dirp=opendir("."); // specify directory here: "." is the "current directory"
    do {
        dent = readdir(dirp);
        if (dent)
        {
            printf("%s  --  ", dent->d_name);
            if (!stat(dent->d_name, &file_stats))
            {
                printf("%u bytes\n", (unsigned int)file_stats.st_size);
            }
            else
            {
                printf("(stat() failed for this file)\n");
            }
        }
    } while (dent);
    closedir(dirp);
}
于 2013-01-30T22:20:31.197 回答