Announcement

Collapse
No announcement yet.

Problem bei ordnerweiser Dateisuche

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem bei ordnerweiser Dateisuche

    Hi.

    mein programm sucht rekursiv dateiendungen. derzeitiger stand ist, das es den inhalt der datei auslesen und dann ausgeben "kann"... nur gibt es da ein problem. die dateisuche beginnt ja in den untersten ordner und dann wieder zum anfangspunkt zurück (hoffe die vorgehnsweise ist nicht falsch beschrieben, ich gehe davon aus, dass windows immer erst ordner und dann erst dateien liest - richtig?)... nur wird hier immer der inhalt der ersten gefundenen datei mit übergeben und nicht die jeweiligen inhalte der folgenden dateien - was den effekt hat, dass immer der gleiche inhalt angezeigt wird (was nicht sein kann!). ich hab jetzt schon versucht den string zu löschen, der den inhalt übergeben bekommt (von einem char array) - bringt aber nix, außer, dass dann die ausgabe leer ist auf einmal... vielleicht hab ich ja dabei einfach was falsch gemacht?

    ich häng hier fest... hab das ganze wochenende mein hirn bemüht... vegebens.

    falls der code nötig post ich ihn noch.

  • #2
    (hoffe die vorgehnsweise ist nicht falsch beschrieben, ich gehe davon aus, dass windows immer erst ordner und dann erst dateien liest - richtig?)...
    Nein, wie in der FAT (FileAllocationTable) anlegt

    Den Rest habe ich nicht so ganz verstanden
    Christian

    Comment


    • #3
      jo, isn bissl umständlich... also,

      ein ordner wird per
      Code:
      FileHandle=FindFirstFile(startOrdnerFE.c_str(),&WFDStr);
      while (FindNextFile(FileHandle,&WFDStr))
      durchsucht, dann entscheidet das prog per
      Code:
      {
      AnsiString FFound= WFDStr.cFileName;  //Gefundener Ordner oder Datei
      if (WFDStr.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && FFound != ".."  && FFound !="." )
      		{
      				startOrdner2 = startOrdner + "\\" + WFDStr.cFileName;
      				// Form2->ListBox1->AddItem(startOrdner2,NULL); // Ausgabe nur zur kontrolle
      				FFSearch(startOrdner2,eingabe);
      		}
      
      if (((WFDStr.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) && (FFound != "..")  && (FFound !="."))) //&& (ExtractFileExt(WFDStr)=="*.rv3")
      		{
      				AnsiString dExt = ExtractFileExt(WFDStr.cFileName); // dateiendung filtern
      
      				if(dExt==".rv3" || dExt==".rsb" || dExt==".rvb")  //SUCHE NACH SPEZIELLEN DATEIFORMATEN
      				{
      ob das gefundene ordner oder datei ist und wenn datei, ob es die spezifischen endungen besitzt. dann kommt der noch nicht auf deinen rat hin abgeänderte teil (ohne TFileStream so zu sagen), der die date per filesttream liest, den inhalt in char array ablegt und dann das char array zu string konvertiert per
      Code:
      AnsiString input = startOrdner + "\\" + WFDStr.cFileName;
      ifstream rein(input.c_str(),ios::binary);  //datei öffnen bzw. erstellen
      
      while(rein.get(ch)) // solange nicht max-kommentarlänge
      					{
      						count++;
      						if(((count>5)&&(count<260))) //nach 5. stelle anfangen array mit kommentar zu füllen
      						{
      							memotext[i] = ch;
      							i++;
      						}
      					}
      
      					AnsiString memoString(memotext,260); //ausgelesenen char[] to String
      					Form2->ListBox1->AddItem(startOrdner + "\\" + WFDStr.cFileName,NULL);
      					Form2->ListBox1->AddItem("Kommentar: " + memoString,NULL);
      			
      					rein.close();
      danach wird eigentlich nur noch der string memoString und der sucheingabe string in jeweils eine stringlist aufgesplittet und die werden dann miteinander verglichen per
      Code:
      split(dateiKommEinzList,memoString," ,.-"); //String splitten - dateiKommEinzList=Splittziel
      split(eingabeEinzList,eingabe," ,.-");
      
      
      					//KONTROLLE
      					for(i=0;i<eingabeEinzList->Count;i++)
      					{
      						Form2->ListBox1->AddItem("Suchwort: " + eingabeEinzList->Strings[i],NULL);
      					}
      					for(i=0;i<dateiKommEinzList->Count;i++)
      					{
      						Form2->ListBox1->AddItem("KommInhalt: " + dateiKommEinzList->Strings[i],NULL);
      					}
      
      
      					//einzelne strings vergleichen
      					for(i=0;i<eingabeEinzList->Count;i++)
      					{
      						if(dateiKommEinzList->IndexOf(eingabeEinzList->Strings[i])>-1)
      						{
      							hilfsvar++;
      						}
      
      					}
      					if (hilfsvar>=1)   //AUSGABE
      					{
      						AnsiString ausgabe = startOrdner + "\\" + WFDStr.cFileName;
      						Form2->ListBox1->AddItem(ausgabe,NULL);
      					}
      
      				}
      
      		}
      	}
      	FindClose(FileHandle);
      	delete(dateiKommEinzList);
      	delete(eingabeEinzList);
      }
      dann ist ja auch schon schluss mit dem prog.
      die roten ausgaben sind jetzt halt mein problem... es kommt nicht das raus, was soll. ein bsp.:
      eine datei im ordner C:\Dokumente und Einstellungen\fiete\Eigene Dateien\Borland Studio-Projekte
      und die andere in C:\Dokumente und Einstellungen\fiete\Eigene Dateien\Borland Studio-Projekte\findfirst

      die zweite wir ja zuerst gelesen... also ist memoString hier "irgendeintext"... nur wenn ich die ausgabe für datei "zwei" erwarte müsste (sollte auch!!!) der memotext bzw memoString inhalt ja "einandererText" sein.

      ist er aber nicht... irgendwas läuft da schief! ich find den fehler nicht!

      Comment


      • #4
        memotext nach jeder Runde mit memset auf 0 setzen
        Wo werden count und i nach jeder Runde auf 0? gesetzt
        Christian

        Comment


        • #5
          ich hab da n kleinen fehler in der beschreibung gemacht... bin schon verwirrt... ähhm, das is eher so, dass wenn zwei dateien in eniem ordner sind das problem auftritt, wenn die dateien aber in zwei verschidenen ordnern(wie oben) sind, funktionierts...

          Comment


          • #6
            also liegts bestimmt an den dingen die du sagst... ich probier mal n bischen! danke erstmal

            EDIT

            HAT SICH ERLEDIGT!!! DAAANKE! hab einfach mal beides gemacht... aber lag definitiv mindestens an dem i oder count... hab vergessen, dass die rekursion ja nur bei ordnern und nicht bei den datein greift... als auch i und count nicht wieder 0 werden... cool
            Zuletzt editiert von fiete; 01.09.2008, 12:10.

            Comment


            • #7
              also das hier bereitet mir jetz noch probleme...
              Code:
              split(dateiKommEinzList,memoString," ,.-"); //dateiKommEinzList=Splittziel
              split(eingabeEinzList,eingabe," ,.-");
              
              //einzelne strings vergleichen
              for(i=0;i<eingabeEinzList->Count;i++)
              {
                  if(dateiKommEinzList->IndexOf((eingabeEinzList->Strings[i]))>-1)
                  {
                      Form2->ListBox1->AddItem(startOrdner + "\\" + WFDStr.cFileName,NULL);
                      Form2->ListBox1->AddItem("Kommentar: " + memoString,NULL);
                  }
              }
              bsp.:
              dateiKommEinzList: "Messung Wert Frau Müller"
              eingabeEinzList: "Frau"

              bei dieser übereinstimmung bekomm ich keine anzeige... und wenn ich den !operator, zum spass, in if nehme kommen egal was ich in den eingabe string eingebe alle möglichen ergebnisse ohne filterung. sieht jemand den fehler? ich denke der rest müsste syntaktisch stimmen... nur mit der ifanweisung bin ich mir nicht sicher. das problem kann eigentlich wirklich nur noch hier irgendwo in dem code begraben liegen - nur wo?

              Comment


              • #8
                " ,.-"

                Das ist DAS Trennzeichen ??
                Christian

                Comment


                • #9
                  ja... geht das so nicht?

                  Comment


                  • #10
                    Durch diese Zeichen (hintereinander) sind die Teile getrennt -> ja
                    Durch EINS von diesen -> nein
                    Christian

                    Comment


                    • #11
                      oh man, du hast wie immer recht... jetzt gehts. nur sag mal, gibt es dann in der stringsplit fkt. auch eine möglichkeit mit mehreren delimiters zu arbeiten? ich dachte ich hätte da schon was genaueres gelesen?!...

                      DANKE DIR VIELMALS!

                      Comment


                      • #12
                        Die Delimiters dort sind nur massgeblich für die Methode "DelimetedText". Dort werden alles Strings[x] zu einem einzigen String zusammengefasst und durch EINEN frei wählbaren ersetzt.
                        Ansosnten hat die TStringList nüscht weiteres mit Delimiters
                        Christian

                        Comment

                        Working...
                        X