Portál AbcLinuxu, 19. dubna 2024 00:50


Dotaz: C - procházení souborů

15.7.2021 07:45 PA
C - procházení souborů
Přečteno: 845×
Odpovědět | Admin
Ahoj,

reším problém, jak v C jednoduše vylistovat a získat názvy soubodů v adresáři a podadresářích.

Díky za rady.

PA

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

15.7.2021 08:36 X
Rozbalit Rozbalit vše Re: C - procházení souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
scandir()?
Řešení 1× (Andrej)
15.7.2021 09:01 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C - procházení souborů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Podla C standardu je to opendir(), readdir() a closedir().
debian.plus@protonmail.com
15.7.2021 18:56 10minuteman
Rozbalit Rozbalit vše Re: C - procházení souborů
To není C standard, to je POSIX standard.

Pokud má OP POSIX, tak OK, jinak může zkusit něco jako TinyDir.
15.7.2021 19:56 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C - procházení souborů
Máš pravdu, POSIX.
debian.plus@protonmail.com
15.7.2021 19:58 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C - procházení souborů
A použi rekurziu.
debian.plus@protonmail.com
18.7.2021 18:54 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: C - procházení souborů
Pokud nebude mít velké stack framy té funkce, která prochází. Vzhledem k tomu, že tazatel nespecifikuje hloubku adresářového stromu, by mu to mohlo padat na přetečení zásobníku. „Univerzálnější“ je prohledávat FS do hloubky bez rekurze: dokud zásobník Z (datová struktura na haldě) cest k adresářům není prázdný, opakuj: vezmi ze Z prvek (cestu k adresáři), vypiš všechny soubory v ní a přidej všechny cesty k podadresářům na Z.

(Tuším tady úkol.)
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
18.7.2021 23:32 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: C - procházení souborů
Rekurze bývá implementována zásobníkem. Není tedy důvod k nepoužívání rekurze.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
19.7.2021 18:27 10minuteman
Rozbalit Rozbalit vše Re: C - procházení souborů
Zásobník je omezený shora, zatímco hloubka podobné iterace bývá nedeterminovaná/telná, takže to může přetéct. Z toho důvodu se například v C++ nedoporučuje binární strom implementovaný pomocí unique_ptr mazat tak, že smažu kořen.
19.7.2021 18:32 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: C - procházení souborů
O jaké hloubce se tady bavíme? Jednotky, tisíce nebo milióny zanoření podadresářů?
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
19.7.2021 22:31 10minuteman
Rozbalit Rozbalit vše Re: C - procházení souborů
Záleží na velikosti stack framu.

Většinou je to samozřejmě jedno, ale je fajn mít to na paměti.
1.8.2021 13:59 rotator
Rozbalit Rozbalit vše Re: C - procházení souborů
Hmm, to s tím uvolňováním stromu C++ by mě nenapadlo a říkám si, že kdybych na to někdy narazil, tak se to bude obtížně ladit... díky za radu!
19.7.2021 11:12 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C - procházení souborů
No, je dalsia moznost. A to pouzit inline rekurziu. Lahko citatelny kod pre pouzivatela a optimalizovany kod pre hardver, s minimimom ukladanych dat. ;)

Ved rekurziu si napis tak, ze pomocne data budu pouzivat haldu a nie stack.

Pripadne cez goto.

V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi.
debian.plus@protonmail.com
21.7.2021 09:05 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C - procházení souborů
V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi. V Linuxe nie je problem zo stackom pri Intel/AMD pouzitom ako bezne PC, lebo ak je maly stack, da sa prealakovat a bude vacsi.
Toto nie je pravda. Da sa iba zmenit velkost pred spustenim (pripadne bez limitu).
debian.plus@protonmail.com
24.7.2021 09:47 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: C - procházení souborů
To není možné si zaalokovat paměť a tam nastavit esp/rsp a ebp/rbp? Nikdy jsem to nezkoušel, ale myslím si, že by to mělo fungovat.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
24.7.2021 10:20 jiwopene | skóre: 31 | blog: Od každého trochu…
Rozbalit Rozbalit vše Re: C - procházení souborů
Tak jsem to zkusil. Zde je kód pro x86_64:
#include <stdio.h>
#include <stdlib.h>

#define CHARS 1024

long int
move_stack(void *stack_bot, void (*jmp_addr)(void));

void
function_in_new_stack(void)
{
	long int foo;
	char string[CHARS];

	for (char *ch = string + CHARS; ch >= string; ch--) {
		*ch = 'A';
	}

	puts(string);

	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);
}

int
main(int argc, char **argv)
{
	long int foo;
	void *stack, *stack_bot;

	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);

	stack = malloc(4096);
	stack_bot = stack + 4096;

	printf("New stack addr.: 0x%lx\n", (size_t) stack);
	printf("New stack bottom: 0x%lx\n", (size_t) stack_bot);

	puts("Moving to the new stack.");

	foo = move_stack(stack_bot, &function_in_new_stack);

	printf("Function worked: 0x%lx %c\n", foo, foo);
	printf("Cur. stack ptr: 0x%lx\n", (size_t) &foo);

	puts("Freeing the stack.");
	free(stack);
}
.globl move_stack
move_stack:
	/* Tyto registry zachováváme. */
	pushq %rbx
	pushq %r12
	pushq %r13
	pushq %r14
	pushq %r15

	/* V %rdi je spodek nového stacku, v %rsi funkce k zavolání. */

	/* Poznamenáme si starou adresu stacku. */
	mov %rsp, %rbx

	/* Přejdeme do nového stacku. */
	movq %rdi, %rsp

	/* Adresu uložíme na nový stack. */
	pushq %rbx

	call %rsi

	/* Vrátíme se zpět. */
	popq %rsp

	/* Uklidíme po sobě. */
	popq %r15
	popq %r14
	popq %r13
	popq %r12
	popq %rbx

	/* Vrátíme 'Y' jako návratovou hodnotu. */
	movq $0x59, %rax

	ret
Funkce move_stack zavolá funkci s daným stackem. Funguje to – viz výstup. Pokud nastavím CHARS na příliš velkou hodnotu (nový stack má 4k), spadne to na SIGSEGV, takže se používá nový stack.
.sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky.
Gréta avatar 21.7.2021 12:12 Gréta | skóre: 36 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: C - procházení souborů

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.