Announcement

Collapse
No announcement yet.

Dateien löschen

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

  • Dateien löschen

    Hallo Leuz,

    ich glaub ich bin zu blöd dazu.
    Ich hab auch dieses Förum und das CBuilder-Forum danach durchsucht, ich blicks einfach nicht.

    Ich will nix anderes machen als den Inhalt des Temp-Verzeichnis löschen.

    So weit wie ich es verstanden habe, muss ich das irgendwie so machen:

    <PRE>
    TSearchRec sr;
    FindFirst("c:\temp\*.*", faAnyFile, sr);
    while(GetLastError()!=ERROR_NO_MORE_FILES)
    {
    FindNext(sr);
    DeleteFile(sr.Name);
    }

    </PRE>

    Bei FindNext(sr); bringt er mir eine AccessViolation an ntdll.dll...blablabla.

    Kann mir bitte jemand helfen ??

    Danke

  • #2
    findfirst gibt schon den ersten Treffer zurück. Dann sollte das löschen erfolgen. mit FindNext suchst du schpn den nächsten Treffe
    Christian

    Comment


    • #3
      Hi Markus,

      könnte an dem faAnyFile liegen, oder an der GetLastError()-Abfrage...

      Bei mir läuft der folgende Code seit 2 Jahren in einem Programm einwandfrei (ohne, daß der catch Block ein einziges Mal aufgerufen wurde, allerdings wird er normalerweise nicht in c:\temp\ ausgeführt):
      <PRE>
      TSearchRec sr;
      AnsiString UpdateFiles = "c:\\temp\\*.*";
      int iAttributes = 0;
      iAttributes |= faAnyFile;
      if (FindFirst(UpdateFiles, iAttributes, sr) == 0)
      {
      do
      {
      try
      {
      DeleteFile(UpdateFilesDir + sr.Name);
      }
      catch(...)
      {
      Application->MessageBoxA("Datei konnte nicht gelöscht werden!", "Fehler", MB_ICONEXCLAMATION);
      }
      } while (FindNext(sr) == 0);
      }
      FindClose(sr);
      </PRE>

      Sollte es trotzdem noch Probleme geben, liegt's wohl daran, daß Du versuchst eine Datei zu löschen, die noch verwendet wird.

      Grüße Joche

      Comment


      • #4
        Hallo,

        danke erst mal für die Hilfe.

        @Christian:
        Da hast Du vollkommen recht. Hätt ich eigentlich auch selber drauf kommen können.

        @Jochen
        Ich hab jetzt mal Deinen Code getestet. Läuft eigentlich ganz gut.
        Allerdings musste ich "UpdateFilesDir" erst noch definieren.
        Und leider bleiben etliche Dateien über. Und zwar Dateien, die ich per Entfernen-Taste problemlos wegbekomme.

        So schaut es jetzt aus:
        <PRE>
        TSearchRec sr;
        AnsiString UpdateFiles = pfad;
        AnsiString UpdateFilesDir=pfad.Delete(pfad.Length()-2,3);
        int iAttributes = 0;
        iAttributes |= faAnyFile;
        if (FindFirst(UpdateFiles, iAttributes, sr) == 0)
        {
        do
        {
        try
        {
        DeleteFile(UpdateFilesDir + sr.Name);
        }
        catch(...)
        {
        Application->MessageBoxA("Datei konnte nicht gelöscht werden!", "Fehler", MB_ICONEXCLAMATION);
        }
        } while (FindNext(sr) == 0);
        }
        FindClose(sr);
        </PRE>

        Wobei pfad einmal "c:\\temp\\*.*" und einmal "C:\\WINNT\\Temporary Internet Files\\*.*" übergeben wird.

        Übrig bleiben z.B. eine Winzip-Datei, HTML-, Gif- und XML-Dateien.

        Ich finde nicht raus warum. Sie haben jedoch im Explorer bei Detailansicht keine Extension.
        Ich hab auch schon vom Dateinamen die ext samt . weggeschnitten. Die Dateien bleiben drin.

        Vielleicht hast Du ja noch einen Tip.

        Ansonsten läuft es super

        Comment


        • #5
          Hallo,<BR>
          die Frage ist ob schon das FindFirst/FindNext Gedöns richtig funktioniert. Eine Alternative wären die guten alten POSIX Funktionen, wie im Beispiel unten mal grob dargestellt. Zumindest könnte man mal sehen ob beide Arten durch das Verzeichnis zu browsen die gleiche Liste von Dateien erzeugen.
          <BR>
          Gruß Armin

          <pre>
          #INCLUDE <dirent.h>

          DIR *directory;
          struct dirent *entry;

          directory = opendir("C:\\TEMP");
          while ((entry = readdir(directory)) != NULL)
          {
          // in entry->d_name steht nun der Name einer Datei
          }
          </pre&gt

          Comment


          • #6
            Du solltest die Attribute zum löschen alle! direkt vorgeben:

            int attribut=faReadOnly|faHidden|faSysFile|faArchive;

            Denn anyfilde heisst nicht etwas "Suche alle Files", sondern "Suche alle Files die kein Attribut haben"

            Sobald eine Datei also schreibgesützt ist, oder readonly wird sie von anyfile nicht erfasst.

            ggf. kannst du von

            http://home.snafu.de/christian.marquardt/dlls.3/3_chfilesearch.html

            den Quelltext haben
            Christian

            Comment


            • #7
              Hallo Christian,

              also deutsche sprache ist doch schwere sprache.
              In der Hilfe steht: faAnyFile: beliebige Datei. Also quasi irgendeine. Aber wohl nicht jede

              Ich hab Deinen rat befolgt.
              Jetzt sind jedenfalls die temp Internet files weg. Aber die schreibgeschützten z.B. das Winzip-File, bleiben da.
              Er springt ja zu

              DeleteFiles(UpdateFilesDir + sr.Name)

              und in "Name" steht auch der Name des Winzip-Files drin. Aber er löscht es nicht.

              Dein chfilesearch kann ich nicht verwenden. Das wollte ich doch mal, funktioniert aber leider unter NT40 nicht

              Comment


              • #8
                Das verstehe ich nicht ganz:

                Was gibst du als Attribut vor??

                int attribut=faReadOnly|faHidden|faSysFile|faArchive|f aAnyFile;

                ?
                Christian

                Comment


                • #9
                  int iAttributes=faReadOnly|faArchive|faHidden|faSysFil e|faAnyFile

                  Comment


                  • #10
                    Hallo Markus,

                    hast Du denn schon versucht, das Attribut der Datei zu ändern?

                    Such mal in der Hilfe nach Attribute, da gibt es die Funktion auf _rtl_chmod(), damit kann man die Attribute einer Datei einlesen und modifizieren.

                    Grüße Joche

                    Comment


                    • #11
                      so verschwinden auch die read-only Daten ...
                      <pre>

                      #include <dirent.h>
                      #include <io.h>
                      #include <sys\stat.h>
                      #include <string.h>
                      void Loeschtemp()
                      {

                      DIR *directory;
                      struct dirent *entry;
                      char path[1024], filename[1024];

                      strcpy(path, "C:\\TEMP\\");

                      directory = opendir(path);
                      while ((entry = readdir(directory)) != NULL)
                      {
                      if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, ".."))
                      {
                      strcpy(filename, path);
                      strcat(filename, entry->d_name);
                      chmod(filename, S_IREAD|S_IWRITE);
                      unlink(filename);
                      }
                      }
                      closedir(directory);
                      }

                      </pre&gt

                      Comment


                      • #12
                        Hallo Armini,

                        wenn ich das richtig sehe, setzt Du mit deinem Code alle Dateien die nicht hidden oder system sind auf even system und hidden. Damit kannst Du dann zwar alle löschen, die vorher hidden und system waren, aber die, die 'normal' waren nicht mehr. Zumindest bei _rtl_chmod ist das eine Toggle-Funktion, ich kann mir nicht vorstellen, daß das bei chmod anders sein soll...

                        Joche

                        Comment


                        • #13
                          Hallo Jochen,<BR>ich hab es mit einer "normalen", einer hidden, einem shortcut und einer read-only Datei ausprobiert, soweit hat es funktioniert. Was in dem kleinen Progrämmelchen nicht berücksichtigt wird, sind Directories, die müssten eben rekursiv abgegrast werden, aber das sollte ja kein problem sein (eben nach dem entsprechenden Attribut checken und ggf mit opendir öffnen etcetc).<BR>Gruß Armin

                          Comment


                          • #14
                            Es gibt noch SetFileAttribute(..
                            Christian

                            Comment


                            • #15
                              Oder auch FileSetAttr() und FileGetAttr()...

                              @Armini: Ich hab' das immer noch nicht verstanden. Wie kann ich denn festlegen, ob das Attribut gesetzt oder gelöscht werden soll? Oder bedeutet das Setzen von S_IWRITE, mit dem ja der Schreibzugriff erlaubt wird, daß diese Datei unabhängig von den Attributen geändert oder gelöscht werden kann?

                              Joche

                              Comment

                              Working...
                              X