2009-05-10 7 views
5

Hier sind einige einfachen Code ignorieren:Wie versteckte Dateien mit opendir und readdir in C-Bibliothek

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) puts(cur->d_name); 

Was bekomme ich Art chaotisch: einschließlich Punkt (.), Punkt-Punkt (..) und Datei Namen, die mit ~ enden.

Ich möchte genau das gleiche wie den Befehl ls tun. Wie repariere ich das bitte?

Antwort

15

Das ist normal. Wenn Sie ls -a tun (die alle Dateien zeigt, wird ls -A zeigen alle Dateien mit Ausnahme von . und ..), sehen Sie die gleiche Leistung.

. ist ein Verweis auf das Verzeichnis, in dem es sich befindet: foo/bar/. ist dasselbe ist foo/bar.

.. ist eine Verknüpfung, die sich auf das übergeordnete Verzeichnis des Verzeichnisses bezieht, in dem es sich befindet: foo/bar/.. ist dasselbe wie foo.

Alle anderen Dateien, die mit . beginnen, sind versteckte Dateien (per Konvention wird es nicht wirklich durchgesetzt; das unterscheidet sich von Windows, wo es ein echtes, offizielles verstecktes Attribut gibt). Dateien mit der Endung ~ sind wahrscheinlich Backup-Dateien von Ihrem Texteditor erstellt (wieder, das ist Konvention, diese wirklich könnte etwas sein).

Wenn Sie diese Dateitypen nicht anzeigen möchten, müssen Sie explizit nach ihnen suchen und sie ignorieren.

+4

+1. Fügen Sie einfach den Text "if (* cur-> d_name! = '.')" Vor "puts (...)" ein, um das Standardverhalten von ls zu erhalten. –

+1

@j_random_hacker: Wenn er keine Backup-Dateien möchte, müsste er auch nach dem Trailing ~ suchen. – Zifre

+0

danke euch allen! Ich würde gerne alle Antworten wählen, wenn ich könnte. Nun, ich habe diese Angelegenheit vollkommen verstanden. Danke nochmal! – fwoncn

1

Dieses Verhalten ist genau wie was ls -a tut. Wenn Sie filtern möchten, müssen Sie es nach der Tat tun.

6

Beseitigung von versteckten Dateien:

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) { 
    if (cur->d_name[0] != '.') { 
     puts(cur->d_name); 
    } 
} 

Beseitigung von versteckten Dateien und Dateien in "~" enden:

DIR* pd = opendir(xxxx); 
struct dirent *cur; 
while (cur = readdir(pd)) { 
    if (cur->d_name[0] != '.' && cur->d_name[strlen(cur->d_name)-1] != '~') { 
     puts(cur->d_name); 
    } 
} 
2

-Stick ein if (cur->d_name[0] != '.'), bevor Sie den Namen bearbeiten.

Der versteckte UNIX-Dateistandard ist der führende Punkt, den . und .. auch übereinstimmen.

Der nachgestellte ~ ist der Standard für Sicherungsdateien. Es ist ein wenig mehr Arbeit, um diese zu ignorieren, aber eine Multi-Gigahertz-CPU kann es verwalten. Verwenden Sie etwas wie if (cur->d_name[strlen(cur->d_name)-1] == '~')

Verwandte Themen