繁体   English   中英

在C中使用dirent.h读取和选择文件

[英]Reading and selecting files using dirent.h in C

我是微控制器编程的新手,但遇到了问题。

我正在尝试制作一种可以播放USB音乐的设备。 我可以从USB读取,但是我不知道如何选择某个文件。 我正在使用dirent

到目前为止,我的代码:

while (true) {
    USBHostMSD msd("usb");
     //setup PWM hardware for a Class D style audio output
    PWMout.period(1.0/400000.0);

    // wait until connected to a USB device
    while(!msd.connect()) {
        Thread::wait(500);
    }

    FILE *wave_file;
    lcd.cls();
    lcd.locate(0,3);


    DIR *dir;
    struct dirent *ent;
    int i=0;
    int stevilo_datotek =0;


    dir = opendir ("/usb/");
    if (dir != NULL) 
    {


        while ((ent = readdir (dir)) != NULL) 
        {   
              lcd.printf ("%s\n", ent->d_name[0]);  
        }
}

现在,此代码显示USB上的内容。 如何使用设备上的按钮浏览USB上的文件? 我想知道是否可以为某些歌曲分配一定的编号,以便进行导航。 我已经研究了dirent.h文件很长时间,但找不到dirent将文件顺序保存在哪里(如果有的话)。

您可能会混淆dirent.h的目的。简而言之,可能很难看到树木茂盛的森林。

您可以将信息(ent-> d_name,请注意ent-> d_name是指向字符数组的指针,通常称为“字符串”)读入数据结构(如数组或列表)中,然后使用该结构使用检测按钮按下的代码将索引向上或向下移动到数组信息中(对于更大或更小的索引,请确保您的索引没有超出范围或结构)。 或者,您可以创建代码,使while循环等待按钮按下,然后仅读取文件名(使用seekdir向后移动)。

更新(以回应评论):请记住,文件系统是树形结构,如下所示:

 / (root) +--- dir1 ----------------------------+- dir1.1 ---- dir2 (empty) -- file1.1 ---- dir3 ---- dir3.1 +--- file3.1 ---- file1 ---- file3.2 ---- file2 

您必须决定如何处理,是仅支持一个目录(让他们将所有音乐文件放在一个位置),还是让他们浏览目录,或者浏览所有目录,仅选择您知道如何播放的文件?

文件(或子目录)没有继承顺序,在某些系统中,可以随时添加或删除文件。

这是保存目录条目列表的一种非常简单的示例:

char *names[400]; // make space for 400 names
int ix;
ix = 0;
if (dir != NULL) 
{
     while ((ent = readdir (dir)) != NULL) 
     {   
           lcd.printf ("%s\n", ent->d_name[0]);  
           // allocate memory to store the name
           names[ix] = (char*) malloc(strlen(ent->d_name)); // strlen from string.h 
                                                            // malloc from stdlib.h
           // copy the name from the directory entry
           strcpy(names[ix], ent->d_name); // strcpy from string.h
           ix++;
           if (ix >= 400) 
           {
               // do something because your array isn't big enough
           }
     }
}

现在,您在数组“名称”中有了您的名称,并可以通过索引对其进行寻址。 值“ ix-1”是您的姓氏,0是您的名字。 按下按钮可以将索引增加/减少到名称数组中,该索引标识您想要的名称。 请记住,其中一些名称可能是目录名称,而不是文件名称。

诚然,这很简单,您可能想分配数组而不是使用固定值(实际上,如果要将“ names”数组传递给调用函数,则必须这样做),有“安全”版本的strcpy (旨在帮助防止内存溢出损坏)等,但它应该使您了解如何将名称保留在内存中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM