uint8_t sd_find_file_in_dir(struct fat16_dir_struct* dd, const char* name, struct fat16_dir_entry_struct* dir_entry) { while(fat16_read_dir(dd, dir_entry)) { if(strcmp(dir_entry->long_name, name) == 0) { fat16_reset_dir(dd); return 1; } } return 0; }
void AF_Wave::reset_dir(void) { fat16_reset_dir(dd); }
/** * \ingroup tcpcmdcommon * \b DIR-Befehl Verzeichnislisting * * Aufruf von USART direkt über DIR-Befehl. Von FTP wird die Funktion * paketweise vom Datenkanal aus aufgerufen.<br><br> * \b Ausgabe: * - auf USART wird komplettes Listing ausgegeben * - bei TCP wird der outbuffer mit vollständigen Verzeichniseinträgen * bis maximal MAX_WINDOWS_SIZE gefüllt. Falls dann noch Einträge * vorhanden sind wird <tt>tcpsrv_status.LISTcontinue</tt> auf true gesetzt. * Bei abgeschlossenem Listing wird <tt>tcpsrv_status.LISTcontinue</tt> auf * false gesetzt. */ int16_t cmd_MMCdir(char *outbuffer) { #if USE_MMC if (!cwdir_ptr) return 0; #if !FTP_ANONYMOUS if (outbuffer && !tcpsrv_status.loginOK) return cmd_530(outbuffer); #endif #if TCP_SERVICE tcpsrv_status.LISTcontinue = 0; // continue Flag zurücksetzen #endif if (!outbuffer) { usart_write("\n\rSD-Karte:"); } char *pstr = outbuffer; struct fat16_dir_entry_struct dir_entry; uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t min; uint8_t sec; /* Verzeichniseinträge lesen */ while(fat16_read_dir(cwdir_ptr, &dir_entry)) { fat16_get_file_modification_date(&dir_entry, &year, &month, &day); fat16_get_file_modification_time(&dir_entry, &hour, &min, &sec); if (outbuffer) { #if TCP_SERVICE char tmpbuf[12]; #ifdef UNIX_LIST /* * UNIX style Dateiliste */ char mstr[4]; if (dir_entry.attributes & FAT16_ATTRIB_DIR) { strcpy_P((char *)tmpbuf,PSTR("drwxr-xr-x")); } else { strcpy_P((char *)tmpbuf,PSTR("-rw-rw-rw-")); } strncpy_P(mstr,&US_Monate[(month-1)*3],3); mstr[3] = '\0'; sprintf_P((char *)pstr,PSTR("%s 1 ftp ftp %ld %s/%i/%i %i:%i %s\r\n"),tmpbuf, dir_entry.file_size, mstr, day, year, hour, min, dir_entry.long_name); #endif #ifdef DOS_LIST /* * DOS style Dateiliste * (bei FileZilla nennt sich das DOS - woanders Windows_NT(?) ...) */ if (dir_entry.attributes & FAT16_ATTRIB_DIR) { strcpy_P((char *)tmpbuf,PSTR("<DIR>")); } else { sprintf_P(tmpbuf,PSTR("%ld"),dir_entry.file_size); } sprintf_P((char *)pstr,PSTR("%i-%i-%i %i:%i:%i %8s %s\r\n"),month, day, year, hour, min, sec, tmpbuf,dir_entry.long_name); #endif while (*pstr++); // bis auf '\0' vorzählen --pstr; if (pstr > (outbuffer + MAX_WINDOWS_SIZE - 64)) { // mind. 64 Bytes für nächsten Eintrag freilassen tcpsrv_status.LISTcontinue = 1; // continue Flag setzen break; } #endif } else { usart_write("\r\n%2i.%2i.%i %2i:%2i ",day, month, year, hour, min); if (dir_entry.attributes & FAT16_ATTRIB_DIR) usart_write(" <DIR> "); else usart_write("%9l ",dir_entry.file_size); usart_write("%s",dir_entry.long_name); } } #if TCP_SERVICE if (!tcpsrv_status.LISTcontinue) fat16_reset_dir(cwdir_ptr); #endif if (outbuffer) return strlen(outbuffer); else #endif return 0; }