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

时间:2014-10-28 15:52:09

标签: c opendir readdir dirent.h

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

我试图制作一个可以播放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保存文件顺序的位置(如果有的话)。

1 个答案:

答案 0 :(得分:0)

你可能会混淆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
           }
     }
}

现在你在数组'names'中有你的名字,并且可以通过索引来解决它们。值'ix-1'是您的姓氏,0是您的名字。按下按钮可以将索引递增/递减到名称数组中,该数组标识所需的名称。请记住,其中一些名称可能是目录名称而不是文件名称。

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