Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема с f_readdir в FatFs
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
DAndy_boy
Господа, у меня следующая проблемка. Прицепил в с вой проект FatFs. Все работает нормально - файлы создаются, читаются, редактируются. Понадобилось мне воспользоваться функцией f_readdir, а именно реализовать пример, который дан в описании на эту функцию : scan_files и она возвращает только один файл в папке (первый созданный) а остальные никак не хочет. Подскажите плиз в чем трабл?
prottoss
Вот так делаю я:

Код
/*******************************************************************************
List current directory (or a specified file/directory)
*******************************************************************************/
BOOL FTPS_CmdLIST(CHAR *args)
{
   /* if not PASV mode, we need a PORT comand first */
if((FALSE == g_PassiveMode) &&
    ((0 == g_DestDataPort) || (0 == g_DestDataIP)))
{
  FTPS_SendResponse("503 Bad sequence of commands.");
        return TRUE;
}

/* if client did not specify a directory, use current dir */
if(0 == *args)
     args = g_CurrPath;

/* create file system directory object and try to open args dir */
FRESULT res;
if(FR_OK != (res = f_opendir(&g_Dir, args)))
    {
       FTPS_SendResponse("550 Can not open directory. FS error %d", res);
        return TRUE;
    }

/* Create data connection to transfer directory list */
TCP_SOCKET *socket;
g_ServerError = FTPS_RES_FAILED_CREATE_DATA_SOCKET;
if(NULL == (socket = FTPS_CreateDataConnection(FTPS_XFER_ASCII)))
  return FALSE; /* Close session */
g_ServerError = FTPS_RES_OK;

/* Fill upper dir entry */
g_FileInfo.fattrib = AM_DIR;
g_FileInfo.fsize = 0;
strcpy(g_FileInfo.fname, "..");

/* Send directory list */
    do
    {
    /* Prepare buffer */
    CHAR *pp = g_DataTxBuf;
  UINT16 total_len = 0;
    
       /* put file object attribute (dir/file) */
       if(g_FileInfo.fattrib & AM_DIR)
         pp[0] = 'd';
        else
   pp[0] = '-';
        pp++;
        total_len++;

        /* put file access attributes */
        UINT16 i = sprintf(pp, "rw-rw-rw-  1 0 0 %6lu ", g_FileInfo.fsize);
        pp += i;
        total_len += i;

        /* Put file creation date */
        i = sprintf(pp, "%.3s %02u %02u:%02u ", "Mar", 26, 0, 0);
        pp += i;
        total_len += i;

        /* Put file name */
        i = sprintf(pp, "%s\r\n", g_FileInfo.fname);
        pp += i;
        total_len += i;
  
  /* Send item in directory list */
  UINT16 transmitted;
     if(NET_RES_OK != TCP_Transmit(socket, 1000, g_DataTxBuf, total_len, &transmitted))
  {
   FTPS_SendResponse("421 Failed to transmit data socket!");
   FTPS_CloseDataConnection();
     return TRUE;
  }
}
while((FR_OK == f_readdir(&g_Dir, &g_FileInfo)) && g_FileInfo.fname[0]);

/* Send end of list */
sprintf(g_DataTxBuf, "\r\n\r\n");
UINT16 transmitted;
    if(NET_RES_OK != TCP_Transmit(socket, 1000, g_DataTxBuf, 4, &transmitted))
{
  FTPS_SendResponse("421 Failed to transmit data socket!");
  FTPS_CloseDataConnection();
  return TRUE;
}

/* OK */
FTPS_CloseDataConnection();
FTPS_SendResponse("220 OK!");
    return TRUE;
}


Это код из готового проекта с ФТП сервером. Но смысл, думаю понятен.
DAndy_boy
Цитата(prottoss @ May 21 2008, 14:14) *
Вот так делаю я:


Странно я тоже делаю похоже.. а результат другой... только первый файл выдается...
Код
void scan_files (char* path)
{
    FILINFO finfo;
    DIR dirs;
    int i;

    if (f_opendir(&dirs, path) == FR_OK) {
        i = strlen(path);
        while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0]) {
            if (finfo.fattrib & AM_DIR) {
                sprintf(&path[i], "%s", finfo.fname);
               scan_files(path);
               *path= 0;
                
            } else {
                printf("%s/%s %d\n", path, &finfo.fname[0],finfo.ftime);
                

            }
        }
    }
}

но на втором круге f_readdir(&dirs, &finfo) выдает нулевую строку
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.