Jak za pomocą biblioteki dirent.h przy wczytaniu zawartości foldera sprawdzić czy wpis jest plikiem czy folderem?
Używsz funkcji : DIR *opendir(const char dirname);
Dir * jest to wskaźnik do struktury:
typedef struct
{
unsigned long _d_hdir; / directory handle */
char _d_dirname; / directory name /
unsigned _d_magic; / magic cookie for verifying handle /
unsigned _d_nfiles; / no. of files remaining in buf /
char _d_buf[sizeof(WIN32_FIND_DATA)]; / buffer for a single file */
} DIR;
Ostatni element tej struktury to tablica char o wielkości struktury z biblioteki windows.h. Struktura ta wygląda tak:
typedef struct _WIN32_FIND_DATA { // wfd
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA;
jak zrobisz takie porównanie : if( dwFileAttributes | FILE_ATTRIBUTE_DIRECTORY) to w wypadku prawdy jest to katalog jeśli wyrażenie było fałszem to jest plikiem.
Tylko jak przekonwertować ten char _d_buf do postaci WIN32_FIND_DATA nie mam pjęcia. Dlatego radze użyć algorytmu zamieszczonego na www.winapi.org do przeszukiwania dysku(dodam że działa bardzo dobrze):
http://www.winapi.org/index.php?option=com_content&task=view&id=36&Itemid=26
Dzięki za odpowiedź!
Hmm, a daloby się to zrobić bardziej przenośnie, by pod linuxem tez chodzilo? Chodzi mi tylko o to czy dany wpis jest katalogiem czy nie...
Za pomocą biblioteki dirent.h na pewno nie. Jak sobie ją otworzysz to zobaczysz tam automatyczne dołączenie biblioteki windows.h. Pod linuxem na pewno jej nie ma, ale pewnie będzie jakaś inna biblioteka , która zczytuje w podobny soposób dane z i-węzła. ale ja nie wiem jaka.
Na razie mam super-debilny sposob polegajacy na tym ze jesli w nazwie wpisu jest kropka to wpis jest plikiem jesli nie katalogiem :D Wiem ze to jest zly sposob, wiec prosze sie nie rzucaj tylko podawac jakies przyklady jak moge to madrze zrobic.
myślałem o tym, ale pisałeś o tym żeby program był przenośny na linuxa, a tam pliki nie mają ort!-czyli kropki też nie mają. Jak coś znajde to ci jeszcze napisze, ale sam nigdy nie robiłem tego bez winapi
Hmm, pliki nie maja kropek w Linuxie ?
Z gory dzieki za pomoc!
maja, maja normalne rozszerzenia. z tym ze interpretacja przez sam os jest troche inna. nazwa nie sklada sie z głowkego członu i rozszerzenia, tylko całośc łącznie z kropką stanowi nazwe pliku. to znaczy, ze nazwy 'plik.' i 'plik' pod windowsem są tożsame, zaś pod linuksem wskazują na 2 rozne pliki. podobnie wyszukiwanie i maski: '*jpg' pod windowsem znajdzie nazwy '*jpg.' (czlon glowny konczy sie na jpg, brak rozszerzenia), a pod *nixami bedize to kazdy plik, ktorego nazwa (rozszerzenie z kropka stanowi czesc integrealna nazwy) konczy sie na jpg, czyli 'tojestjpg' '.jpg' (to tez jest prawidlowa nazwa), 'dziewczyna.informatyka.jpg'
jedynie pliki wykonywalne poznaje sie po atrybutach, nie po rozszerzeniu.
W wxWidgets są przenośne funkcje do tego.
http://www.wxwidgets.org/
</url>