[ANSI C] Obsługa katalogów

0

Jak za pomocą biblioteki dirent.h przy wczytaniu zawartości foldera sprawdzić czy wpis jest plikiem czy folderem?

0

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

0

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...

0

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.

0

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.

0

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

0

Hmm, pliki nie maja kropek w Linuxie ?

Z gory dzieki za pomoc!

0

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.

0

W wxWidgets są przenośne funkcje do tego.
http://www.wxwidgets.org/
</url>

1 użytkowników online, w tym zalogowanych: 0, gości: 1