微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

_findnext() 返回一个大小为 1 的列表,而有很多文件

如何解决_findnext() 返回一个大小为 1 的列表,而有很多文件

fmntr.c:

#include <time.h>
#include <stdio.h>
#include <io.h>

// defined in io.h
/*struct _finddata_t
{
    unsigned attrib;
    size_t time_create;
    size_t time_access;
    size_t time_write;
    _fsize_t size;
    char name[_MAX_PATH];
};
*/

enum {
    FMNTR_SHOW_SYstem_FILES = 0b1,FMNTR_SHOW_HIDDEN_FILES = 0b10,};

void iter_files(char *path,int flags) {
    struct _finddata_t finddata;
    intptr_t const handle = _findfirst(path,&finddata);

    if (handle == -1)
    {
        fprintf(stderr,"iter_files(): path \"%s\" is invalid.\n",path);
        return;
    }

    int print_title = 1;
    do {
        if (finddata.attrib & _A_SYstem && !(flags & FMNTR_SHOW_SYstem_FILES)) continue;
        if (finddata.attrib & _A_HIDDEN && !(flags & FMNTR_SHOW_HIDDEN_FILES)) continue;
        
        if (print_title) {
            printf("%-20s%15s%15s%15s%15s%15s\n","FILE NAME","SIZE","ATTRIB","CREATED","ACCESSED","WRITTEN");
            print_title = 0;
        }

        printf("%-20s%15d%15d%15d%15d%15d\n",finddata.name,finddata.size,finddata.attrib,finddata.time_create,finddata.time_access,finddata.time_write);   
    } while (_findnext(handle,&finddata) == 0);
    _findclose(handle);
}

void main(int argc,char *argv[]) {
    if (argc < 2) {
        fprintf(stderr,"Usage: fmntr <path>\n");
        return;
    }
    iter_files(argv[1],0);
}

_findfirst() 运行良好,但 _findnext() 总是返回 -1,因此该程序只能获取目录的第一个文件

  1. 在 d:\ws\c 中,有 3 个文件。一切都没有隐藏:
    • a.exe(由 gcc fmntr.c 制作)
    • compose.c(另一个程序)
    • fmntr.c(此程序的来源)

我的命令行:

D:\ws\c>a .
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
c                                 0             16     1626182137     1626240328     1626240328

D:\ws\c>a .\*
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
a.exe                        374891             32     1626240328     1626240328     1626240328

D:\ws\c>a d:\ws\c
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
c                                 0             16     1626182137     1626240328     1626240328

D:\ws\c>a d:\ws\c\*
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
a.exe                        374891             32     1626240328     1626240328     1626240328

D:\ws\c>a d:\ws\c\*.*
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
a.exe                        374891             32     1626240328     1626240328     1626240328

D:\ws\c>a d:\ws\c\a.exe
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
a.exe                        374891             32     1626240328     1626240328     1626240328

D:\ws\c>a d:\ws\c\compose.c
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
compose.c                      1462             32     1626182302     1626232744     1626186199

D:\ws\c>a d:\ws\c\fmntr.c
FILE NAME                      SIZE         ATTRIB        CREATED       ACCESSED        WRITTEN
fmntr.c                        1945             32     1626229513     1626240306     1626240306

D:\ws\c>

如您所见,即使我使用了通配符,它​​也只打印了一个文件信息。 我已经调试过了,_findfirst() 总是成功(一旦路径有效),但 _findnext() 总是失败。

操作系统:Windows 10 64 位; 编译器:TDM-GCC 64 位。

编辑:问题已解决。命令行将“.*”解释为文件路径字符串列表。因此 argv[1] 是“a.exe”,argv[2] 是“compose.c”,...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。