Bir C programında bir dizindeki dosyalar nasıl listelenir?


91

Linux'ta bir ftp sunucusu yazmaya çalışıyorum. Bu konuda bir C programı ile terminaldeki dizindeki dosyaları nasıl listeleyebilirim? Belki find komutunu çalıştırmak için exec işlevini kullanabilirim ama istemci programı göndermek için dosya adını bir dizge olarak istiyorum. Bunu nasıl yapabilirim?

Cevaplar için teşekkürler.

Yanıtlar:


178

POSIX uyumlu sistemler için mevcut bir örnek:

Böyle bir işlemin C'de platforma bağlı olduğuna dikkat edin.

Kaynak: http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1046380353&id=1044780608


şimdi tamam ve çok kolay. Cevabınız için tekrar teşekkürler.
cemal

13
beğendiyseniz lütfen doğrulayın;)
Jean-Bernard Jansen

1
Harika, peki ya sadece pngdosya istiyorsak ?
Farsheed

2
@Farsheed: deneyin bu .
ashastral

Bununla birkaç sorunla karşılaşıyorum. İlk, "." ve ".." her dizinin üstünde görünür ve "dizinler" olmalarına rağmen, dizin-> d_type DT_REG olarak ayarlanmışlardır. Ayrıca, tüm dosyaları alamıyorum ... Bir yerlerde daha kapsamlı bir "dizin tarayıcı" kodu var mı? Belki "ls" nin bazı zavallı uygulamaları? Buna Mac'te ihtiyacım var - OS-X
Motti Shneor

36

JB Jansen'in cevabına küçük bir ekleme - ana readdir()döngüde şunu ekleyeceğim:

Sadece gerçekten dosya olup olmadığını kontrol etmek, (sym) bağlantısı, dizin veya her neyse değil.

NOT: hakkında daha fazla struct direntyer libcbelgeler .


6
Sadece bir kenara: Tüm platformlar d_typedolmayacak, ancak Linux ve BSD dolduracak (Sorunun Linux olarak etiketlendiğini biliyorum, sadece yanıtı biraz genişletiyor); o zaman bile, tüm dosya sistemleri aynı şekilde desteklenmez , ancak çoğu FS ile çalışması gerekir.
omninonsense

11

İşte klasör içeriğini yinelemeli olarak nasıl listeleyeceğiniz konusunda eksiksiz bir program:


4

Aşağıdaki kod yalnızca dizin içindeki dosyaları yazdıracak ve çapraz geçiş sırasında verilen dizin içindeki dizinleri hariç tutacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.