c++ Dateiarbeit

Diskutiere c++ Dateiarbeit im C/C++ Forum im Bereich Programmieren unter Linux/Unix; Hi, brauch mal dringend Eure Hilfe!!! Ich muss ab einen bestimmten Verzeichnis alle Dateien inkl. der von den weiteren Unterverzeichnissen...

  1. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    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
     
  2. Anzeige

    Anzeige

    Wenn du mehr über Linux erfahren möchtest, dann solltest du dir mal folgende Shellkommandos anschauen.


    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 kotzkroete, 08.01.2008
    kotzkroete

    kotzkroete Doppel-As

    Dabei seit:
    22.10.2006
    Beiträge:
    132
    Zustimmungen:
    0
    Schreib doch ein Shellscript und uebergib nacheinander die Dateinamen an dein Programm.
     
  4. #3 juan_, 08.01.2008
    Zuletzt bearbeitet: 08.01.2008
    juan_

    juan_ König

    Dabei seit:
    22.01.2004
    Beiträge:
    994
    Zustimmungen:
    0
    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!
     
  5. #4 Lesco, 08.01.2008
    Zuletzt bearbeitet: 08.01.2008
    Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    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.
     
  6. juan_

    juan_ König

    Dabei seit:
    22.01.2004
    Beiträge:
    994
    Zustimmungen:
    0
    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
     
  7. Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    Ich kann zwar kein Ruby, doch wo genau kommen denn dort die Unterverzeichnisse vor? ".." bezeichnet das übergeordnete und "." das aktuelle Verzeichnis.
     
  8. juan_

    juan_ König

    Dabei seit:
    22.01.2004
    Beiträge:
    994
    Zustimmungen:
    0
    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
     
  9. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    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?
     
  10. Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    Meine Vorschlag mit der Rekursion funktioniert in C++ und eigentlich in jeder Sprache die ich kenne.
     
  11. #10 SkydiverBS, 09.01.2008
    SkydiverBS

    SkydiverBS Tripel-As

    Dabei seit:
    15.01.2005
    Beiträge:
    207
    Zustimmungen:
    0
    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
     
  12. #11 pferdefreund, 10.01.2008
    pferdefreund

    pferdefreund Gast

    ... oder einen find-befehl per pipe wieder einlesen und auseinanderdröseln
     
  13. mapiox

    mapiox Tripel-As

    Dabei seit:
    21.04.2002
    Beiträge:
    176
    Zustimmungen:
    0
  14. rdg

    rdg ???

    Dabei seit:
    12.10.2006
    Beiträge:
    357
    Zustimmungen:
    0
    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
     
  15. juan_

    juan_ König

    Dabei seit:
    22.01.2004
    Beiträge:
    994
    Zustimmungen:
    0
    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
     
  16. #15 der_Kay, 15.01.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    Muss das unbedingt C++ sein?
     
  17. Lesco

    Lesco segmentation fault

    Dabei seit:
    18.12.2005
    Beiträge:
    67
    Zustimmungen:
    0
    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.
     
  18. #17 der_Kay, 16.01.2008
    Zuletzt bearbeitet: 16.01.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    Der Post steht im C/C++ Forum.
    ...und sollte gegen die stapelbasierte iterative Variante ausgetauscht werden um Speicherpolatz zu sparen
    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...
     
Thema:

c++ Dateiarbeit

  1. Diese Seite verwendet Cookies um Inhalte zu personalisieren. Außerdem werden auch Cookies von Diensten Dritter gesetzt. Mit dem weiteren Aufenthalt akzeptierst du diesen Einsatz von Cookies.
    Information ausblenden