【问题标题】:Reading and selecting files using dirent.h in C在 C 中使用 dirent.h 读取和选择文件
【发布时间】:2014-10-28 15:52:08
【问题描述】:

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

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

【问题讨论】:

    标签: c opendir readdir dirent.h


    【解决方案1】:

    您可能会混淆 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 是您的名字。您的按钮按下可以增加/减少您的名称数组中的索引,该数组标识您想要的名称。请记住,其中一些名称可能是目录名称而不是文件名称。

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

    【讨论】:

    • 是的,一旦我获得每个文件的索引,我已经弄清楚了如何编程。但是我在获取这个索引时遇到了问题。如果您能解释如何获取每个文件的索引,我将不胜感激。我有点想不出还有什么可以尝试的......
    • 非常感谢您的帮助。类似于我自己尝试过的东西,但我想我没有做对。无论如何,就像一个魅力。感谢帮助。 :)
    • 我的荣幸。如果您感到高兴,请随意将其标记为答案(我得到积分,它会将问题从未回答的列表中删除)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多