簡體   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