c++ Dateiarbeit

R

rdg

???
Hi,

brauch mal dringend Eure Hilfe!!!
Ich muss ab einen bestimmten Verzeichnis alle Dateien inkl. der von den weiteren Unterverzeichnissen konvertieren, deshalb muss ich die Namen mit den Pfad in ein Array Speichern.
Und da ich überhaupt keine Idee habe, wie ich dies machen kann wollte ich Euch um hilfe bitten.


dank und gruß
rdg
 
Schreib doch ein Shellscript und uebergib nacheinander die Dateinamen an dein Programm.
 
hey,

zwar kein C++, aber nen kleines Rubyscript, welches dir den Ordnerinhalt in ein Array schreibt:

Code:
#!/usr/bin/ruby
dir = Dir.new(".")
inhalt = []
while entry = dir.read
	if entry != "." && entry != ".."
	inhalt.push entry
	end
end

dir.close
puts inhalt.sort!

Geht vllt auch eleganter, aber mehr liegt im Moment nicht im Bereich meiner Möglichkeiten ;)
Was du damit jetzt weiter anstellst, bleibt dir überlassen ;)

ciao

//edit:
ach so, grad gesehen.. inkl. der Unterverzeichnisse. Das o.g. Script macht das jetzt erstmal nur in dem aktuellen Verzeichnis (also das, wo das Script liegt). Das kannst du natürlich umbasteln, indem du den "do-Zweig" in der if-Anweisung beauftragst, auch in "." bzw ".." zu suchen!
 
Zuletzt bearbeitet:
//edit:
ach so, grad gesehen.. inkl. der Unterverzeichnisse. Das o.g. Script macht das jetzt erstmal nur in dem aktuellen Verzeichnis (also das, wo das Script liegt). Das kannst du natürlich umbasteln, indem du den "do-Zweig" in der if-Anweisung beauftragst, auch in "." bzw ".." zu suchen!
Das reicht nicht, da die Unterverzeichnisse nicht berücksichtigt werden, sondern lediglich das Überverzeichnis("..").

Ich würde das ganze rekursiv lösen: Gehe jeweils den Inhalt des Verzeichnisses durch, falls du ein Unterverzeichnis findest, rufst du wiederum die selbe Funktion(in der du dich gerade befindest) mit dem Unterverzeichnis als Parameter auf.
Der Zugriff an sich wird hier beschrieben: http://www.pronix.de/pronix-82.html
Die Pfadnamen selbst kannst in einem std::vector speichern.
 
Zuletzt bearbeitet:
Das reicht nicht, da die Unterverzeichnisse nicht berücksichtigt werden, sondern lediglich das Überverzeichnis("..").

wie meinst du? (:))
könnte ich nicht einfach sagen,
Code:
i =+ 1
if dir = "." || ".."
dir#{i} = Dir.new("./.")
(bitte nicht versuchen.. nur gedanklich niedergetragen)

oder so?

also, dass ich die dir - variable in ner Zählschleife immer um den Faktor eins erweitere und das Skript dann dadurch im Unterverzeichnis wieder aufrufe?

ciao
 
Ich kann zwar kein Ruby, doch wo genau kommen denn dort die Unterverzeichnisse vor? ".." bezeichnet das übergeordnete und "." das aktuelle Verzeichnis.
 
Ich kann zwar kein Ruby, doch wo genau kommen denn dort die Unterverzeichnisse vor? ".." bezeichnet das übergeordnete und "." das aktuelle Verzeichnis.
Hupps stimmt. Wie peinlich! Irgendwie habe ich da was verwechselt ;)

Wenn man allerdings die Ordnerstruktur kennt, koennte man -mit ein bisschen Handarbeit- aber jedem Ordner einen Variable zuweisen und dann koennte man es doch hinbasteln. Ist aber halt leider nicht automatisch..

ciao
 
Sorry, habe momentan kein Internet (Wechsel) deshalb muss ich alles im Internetcafe erledigen, echt beschissene Situation.
Geht das auch mit C++ oder nur mit Ruby?
 
Meine Vorschlag mit der Rekursion funktioniert in C++ und eigentlich in jeder Sprache die ich kenne.
 
C++ bittet AFAIK selbst keine Funktionen für den Umgang mit Verzeichnissen, deswegen musst du auf C-Bibliotheken zurückgreifen. Lesco hat dir schon einen Link gepostet, wie man unter C mit Verzeichnissen arbeitet.

Hier noch ein Verweis auf eine beispielhafte Implementierung in C++: Beispiel: Zugriff auf Verzeichnisse.

Gruß,
Philip
 
... oder einen find-befehl per pipe wieder einlesen und auseinanderdröseln
 
erstmal vielen Dank für Eure Hilfe !!!
Bin gerade daran sogut es mir ohne Internet möglich ist alles abzuarbeiten.

vielen dank an Euch!
rdg
 
Das reicht nicht, da die Unterverzeichnisse nicht berücksichtigt werden, sondern lediglich das Überverzeichnis("..").

Ich würde das ganze rekursiv lösen: Gehe jeweils den Inhalt des Verzeichnisses durch, falls du ein Unterverzeichnis findest, rufst du wiederum die selbe Funktion(in der du dich gerade befindest) mit dem Unterverzeichnis als Parameter auf.
Ok, ich habe weiter gelernt... wenn auch sehr langsam :)
Hier ein rekursiver Ansatz:
Code:
def listdir(dir, intend=0)

	d = Dir.new(dir)
	while entry = d.read
		path = dir + "/" + entry
			if File.directory?(path)
				puts "#{' ' * intend}[#{entry}]"
				listdir(path, intend+2) if entry !~ /^\.{1,2}$/
			else
				puts "#{' ' * intend}#{entry}"
			end
	end
		
d.close
end

Dieser listet dir den Inhalt des aktuellen Verzeichnisses auf. Alle Unterordner werden in []-Klammern dargestellt und alles was sich darin befindet, wird eingerückt.

In Kombination zum o.g kannst du jetzt mit der If-Schleife die "." und ".." ausblenden und in ein Array schreiben. Mit einer weiteren Modifikation könntest du auch die Unterordner ausblenden, und nur den Inhalt ausgeben.

Ich hoffe, dass ich dir helfen konnte, auch wenn du nach C++ verlangt hast :)
Vielleicht ist das ja ein brauchbarer Ansatz, sooo verschieden sollen die Sprachen ja garnicht sein.

Jetzt müsste ich nur noch konvertieren können :S
 
Abgesehen von den Funktionen zum Verzeichniszugriff ist die Sprache doch völlig irrelevant. Der Algorithmus(Rekursion für Unterverzeichnisse) wurde hier nun mehrfach genannt und sollte sich in so gut wie jeder Sprache implementieren lassen.
 
Abgesehen von den Funktionen zum Verzeichniszugriff ist die Sprache doch völlig irrelevant.
Der Post steht im C/C++ Forum.
Der Algorithmus(Rekursion für Unterverzeichnisse) wurde hier nun mehrfach genannt
...und sollte gegen die stapelbasierte iterative Variante ausgetauscht werden um Speicherpolatz zu sparen
und sollte sich in so gut wie jeder Sprache implementieren lassen.
Oder auch nicht:
".", ".." oder symbolische Links führen u. U. zu endloser Rekursion/Traversion.

Die C/C++ Routinen wie readdir() oder stat() sind umständlich zu handhaben.

Ausserdem erfordert die Traversierung in C/C++, dass man Zeichenketten für die angetroffenen Verzeichnisse konstruieren muss.


Wollte ich nur anmerken... Ich hätte z. B auch lieber das Find-Paket von Perl verwendet...
 
Zuletzt bearbeitet:

Ähnliche Themen

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

Keine grafische Oberfläche (Debian Installation)

Shell Skript beschleunigen

PATH wird nicht richtig durchsucht

diff in Bezug zu sed setzen

Zurück
Oben