Inhalte eines Ordners prüfen



  • Laß Dich registrieren. Dann kann zumindest niemand Deinen Nickname mißbrauchen. 😉



  • So habe mich nun registriert, um mich vor Missbrauch zu schützen. 🙂

    Um nochmals zu klären was mein Problem ist:

    1. Ich habe 1 Ordner(y) wo X Datein drin sind.

    2. Von diesem Ordner(y) aus sollen nun nacheinander alle Files gemoved werden zu einem anderen Ordner(z), aber in dem Ordner(z) wo die Datei hingemoved werden soll darf nur dann etwas reigemoved werden, wenn der ordner leer ist.

    3. Das ganze soll so lange stattfinden bis alle Datein aus dem Ordner(y) weggemoved worden sind.



  • Ja und ?
    Du hast deine Dateinamen sicherlich in irgendeiner Liste stehen.
    (TStringList) stehen.Wenn ich das richtig gesehen habe in einem Memo.
    Alle 3 Sekunden holst du dir aus dieser Liste eine andere "Zeile" (neuen Dateinamen) und kopierst diese Datei in deinen Zielordner.



  • Eigentlich könnte der Thread geschlossen werden, es ist alles gesagt worden



  • Jaja ds ist mir in etwa schon klar, aber das Problem ist folgendes

    if (Query1->Fields->Fields[9]->AsString == "ISDN")
       {
         {
         TSearchRec SearchRec1;
    AnsiString szDirectory1;
        szDirectory1="C:\\T_ISDN\\";
        if (FindFirst(szDirectory1 + "*.*" , faAnyFile, SearchRec1) == 0)
        {
        ShowMessage("Ordner Voll versuch es nochmal");
        }
        else
        {
         Memo1->Lines->SaveToFile("C:\\T_ISDN\\"+Query1->Fields->Fields[0]->AsString+"_nerv.gtw");
         Memo1->Lines->Clear();
         }
    

    Wenn der Ordner eine Datei enthält gibt gibt er die Showmessage aus und macht dann normal weiter mit der for-schleife

    for (Query1->First();!Query1->Eof;Query1->Next())
    

    Aber was ich brauche ist eine Art repeat funktion in der If-Schleife, denn er soll ja keinen Datensatz überspringen sonder so lange in der Schleife bleiben bis der Ordner wieder frei ist, ansonsten überspringt er alle und speichert nur eine Datei.



  • Wieviel male wurde hier schon gesagt, das du die Schleife nicht brauchst ?
    Also nochmal:Du setzt das was in der Schleife passiert in einen Timer.
    Und das:

    for (Query1->First();!Query1->Eof;Query1->Next())
    

    raus ....



  • wieviel mal habe ich gesagt das das nicht funzt....

    //--- Wenn keine Datein gewählt wurden gar nicht erst mit Transfer starten
    if (Form1->ListBox1->Items->Count ==0)
     {
     ShowMessage("Bitte Dateien auswählen");
     }
      else
       {
    
    for (Query1->First();!Query1->Eof;Query1->Next())
    {
    Timer1->OnTimer = Timer1Timer;
    }
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    Timer1->Enabled=false;
    TStringList* lol = new TStringList();
    int i=0,b=0;
    int B=0;
    
    //---Anfang der Kopfzeile der Textdatei------------------------------
    Memo1->Lines->Clear();
    b=0;
    Label5->Caption = FormatDateTime("DDD, DD. MMM YYYY HH:MM:SS +0001", Now());
    Memo1->Lines->Add("$$ Hotel");
    Memo1->Lines->Add("T "+Query1->Fields->Fields[0]->AsString+Query1->Fields->Fields[8]->AsString+"");
    Memo1->Lines->Add("");
    Memo1->Lines->Add("From: Hotel");
    Memo1->Lines->Add("Organization: Hotel");
    Memo1->Lines->Add("To: "+Query1->Fields->Fields[0]->AsString+Query1->Fields->Fields[8]->AsString+"("+Query1->Fields->Fields[1]->AsString+" "+Query1->Fields->Fields[2]->AsString+")");
    Memo1->Lines->Add("Date: "+Label5->Caption);
    Memo1->Lines->Add("Subject: FileTransfer");
    Memo1->Lines->Add("Application: Soft 0.5");
    Memo1->Lines->Add("");
    //--- Ende der Kopfzeile----------------------------------------------
    
    //--- Einfacher Zähler------------------------------------------------
      for (i=0; i<ListBox1->Items->Count; i++)
        {
         b++;
        }
    //--------------------------------------------------------------------
    
    //--- Einfügen von Textdatei zur Komplettdatei------------------------
    Memo1->Lines->Add("FileCounter: "+IntToStr(b));
    
      for (i=0; i<ListBox1->Items->Count; i++)
      {
      Label5->Caption=ListBox1->Items->Strings[i];
      lol->LoadFromFile(ListBox1->Items->Strings[i]);
      Memo1->Lines->Add("FileName: "+LowerCase(ExtractFileName(Label5->Caption)));
      Memo1->Lines->Add("FileType: ASCII");
      Memo1->Lines->AddStrings(lol);
      }
    //---------------------------------------------------------------------
    
    //--- Datein speichern anhand der Menge der Datensätze die vorhanden sind
      B++;
      if (Query1->Fields->Fields[12]->AsString == "Falsch")
      {
       if (Query1->Fields->Fields[9]->AsString == "ISDN")
       {
         {
         Memo1->Lines->SaveToFile("C:\\T_ISDN\\"+Query1->Fields->Fields[0]->AsString+"_nerv.gtw");
         Memo1->Lines->Clear();
         }
       }
       else
       {
        Memo1->Lines->SaveToFile("C:\\T_ANAL\\"+Query1->Fields->Fields[0]->AsString+"_nerv.gtw");
       Memo1->Lines->Clear();
       }
      }
    else{};
    Timer1->Enabled=true;
    }
    }
    }
    

    So, normalerweise sollte er ja jetzt alle 3Sekunden einen Datesatz anfügen bis zum Schluss.. macht er aber nicht..



  • for (Query1->First();!Query1->Eof;Query1->Next()) 
    { 
    Timer1->OnTimer = Timer1Timer; 
    }
    

    Was willst Du damit erreichen?

    Du weist dem Ereignis OnTimer sooft den Wert Timer1Timer (Programmroutine) zu, wie die Schleife durchlaufen wird. Und das hintereinander weg.

    Ich persönlich verstehe den Sinn dieser Code-Zeilen nicht. 😕

    Auslösen tust Du das Ereignis so nicht.



  • Ja das ist mir auch schon aufgefallen das das schwasinnig ist :(.

    Aber ich weiss nunmal nicht wie es geht deswegen Frage ich ja nach einer Hilfe von euch.

    Manche sagen schreib die Schleife raus andere rein...
    Mein Fazit schreibe ich sie Raus ist es Quatsch..
    Schreibe ich sie rein, macht er alle 3sec alle Files neu,
    was ja auch nicht dem Sinn entspricht.

    Deswegen hatte ich ja vor sie bei der Ausgabe zu machen.

    if (Query1->Fields->Fields[12]->AsString == "Falsch")
      {
       if (Query1->Fields->Fields[9]->AsString == "ISDN")
       {
        Memo1->Lines->SaveToFile("C:\\T_ISDN\\"+Query1->Fields->Fields[0]->AsString+"_ODDSET.gtw");
       Memo1->Lines->Clear();   
    }
    
      else
       {
        Memo1->Lines->SaveToFile("C:\\T_ANAL\\"+Query1->Fields->Fields[0]->AsString+"_ODDEST.gtw");
       Memo1->Lines->Clear();
       }
    

    ..denn da wird bei jedem Schleifendurchlauf 1 Datei Analog und 1 Datei ISDN gepseichert,
    und da er ja nach jeder Speicherung 3sek warten soll, muss der Timer da irgendwie rein nur wie ?...

    Wichtig ist das so lange die verdammte for-Schleife nicht weiterlaufen darf !!,da sie sonst Datensätze überspringt und die Dateien nicht speichert(hatte ich aber alles schon 10x erwähnt). 🙂



  • void __fastcall TForm1::Timer1Timer(TObject *Sender) 
    { 
       Timer1->Enabled=false; 
       if(!Query1->Eof) 
       {
    
          //Dein Teil zum speichern
    
          Query1->Next();
          Timer1->Enabled=true;
       }
       else Timer1->Enabled=false;
    }
    

    Beim Timer starten was du über Buttonclick oder sonstwo tust solltest du noch dein

    Query1->First();
    

    ausführen.



  • Oh das sieht nicht schlecht aus.
    Das werde ich gleich mal richtig anpassen hatte schon einen kleinen Test gemacht, das er mir alle 3 Sekunden den Benutzernamen ausgibt und dann den nächsten... das geht schonmal.

    Danke schonmal 🤡



  • Sehr gut es funzt 🙂
    Hab vielen Dank 😉

    Nun wäre dann nur noch das Problem mit dem Ordner.. haste dafür auch noch ne lösung 🙂 ?

    Ich erkläre es nochmal ;-):

    1. Ordner X ist leer= Ok 1 Datei darf rein
    2. Ordner X eine Datei drin gehe auf Ordner Y
    3. Ordner Y ist leer= Ok 1 Datei darf rein
    4. Ordner Y eine Datei drin gehe auf Ordner Z
    5. Ordner Z ist leer= Ok 1 Datei darf rein
    6. Ordner Z eine Datei drin gehe auf den nächsten freien Ordner (X,Y,Z)
    wo keine Datei mehr drin ist. Ansonsten Warte bis 1 Ordner Frei ist bis alle Datein verstaut sind 😃



  • Ist zwar eigentlich nicht meine Art aber hab mich ausnahmsweise überwunden, und sowas in der Art gebastelt.
    Musst du noch entsprechend anpassen. 😉

    bool DirIsEmpty(String Dir)
    {
       TSearchRec SR;
       bool res=true;
       if (FindFirst(Dir+"*",faAnyFile,SR)==0)
       {
          while (!FindNext(SR)&&res)
          {
             if(SR.Name!=".."&&SR.Name!=".") res=false;
          }
       }
       FindClose(SR);
       return res;
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Timer1->Enabled = true;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
       Timer1->Enabled = false;
       //Liste mit Ordnern (TStringList ordner)
       TStringList *ordner=new TStringList();
       ordner->Add("c:\\x\\");
       ordner->Add("c:\\y\\");
       ordner->Add("c:\\z\\");
       //Wenn noch Dateien(TMemo memfiles) zum schreiben da sind alle Ordner überprüfen ob leer
       for(int i=0;i<ordner->Count&&memfiles->Lines->Count;i++)
       {
          /*Wenn Ordner leer(Funktion DirIsEmpty), dann Text (TMemo memtext) im Ordner speichern und Dateinamen aus
          Dateiliste memfiles entfernen*/
          if(DirIsEmpty(ordner->Strings[i]))
          {
             memtext->Lines->SaveToFile(ordner->Strings[i]+memfiles->Lines->Strings[memfiles->Lines->Count-1]+".txt");
             memfiles->Lines->Delete(memfiles->Lines->Count-1);
          }
       }
       //Speicher Ordnerliste freigeben.
       delete ordner;
       //Wenn noch Dateien in der Liste sind Timer weiterlaufen lassen
       if(memfiles->Lines->Count) Timer1->Enabled=true;
       //sonst Timer abschalten und Nachricht ausgeben.
       else
       {
          Timer1->Enabled = false;
          Application->MessageBox("Alle Dateien geschrieben.","Meldung",MB_OK);
       }
    }
    


  • Vielen Dank da werde ich mich morgen gleich ran machen 😃


Anmelden zum Antworten