Cookies und anderen Müll löschen

Code-Stücke können hier veröffentlicht werden.
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Mittwoch 31. Januar 2007, 10:21

Hi,
Der lästige Windowsmüll mit einem Schlag wech.
Gruss, Seven

Code: Alles auswählen

# -*- coding: iso-8859-1 -*-
'''
Befreit Windows-XP von temporärem Datenmüll

'''

import win32con, win32api,os

tempinternetpath = 'C:/Dokumente und Einstellungen/xx/Lokale Einstellungen/Temporary Internet Files'
temppath = 'C:/Dokumente und Einstellungen/xx/Lokale Einstellungen/Temp/'
cookiespath = 'C:/Dokumente und Einstellungen/xx/Cookies/'
zuletztverwendet = 'C:/Dokumente und Einstellungen/xx/Recent'

#--------------------------------------- Temporary Internet Files -----------------------------------------
win32api.SetFileAttributes(tempinternetpath, win32con.FILE_ATTRIBUTE_NORMAL)     # Dateiattribut auf 'normal' setzen
allefiles = os.listdir(tempinternetpath + '/')
for af in allefiles:
    if os.path.isfile(tempinternetpath + '/' + af):                                                # Check ob File
        try:
            os.remove(tempinternetpath + '/' + af)                                               # Temporary Internet Files löschen
        except:
            pass
win32api.SetFileAttributes(tempinternetpath,win32con.FILE_ATTRIBUTE_HIDDEN)      # Dateiattribut auf 'versteckt' setzen
#------------------------------------------------- Temp -----------------------------------------------------
allefiles = os.listdir(temppath)
for af in allefiles:
    if os.path.isfile(temppath + af):     
        try:
            os.remove(temppath + af)                                                                  # Temp-Files löschen
        except:
            pass
#------------------------------------------------ Cookies ---------------------------------------------------
allefiles = os.listdir(cookiespath)
for af in allefiles:
    if af <> 'index.dat':
        if os.path.isfile(cookiespath + af):         
            try:
                os.remove(cookiespath + af)                                                          # Cookies löschen
            except:
                pass
#----------------------------------- zuletzt verwendete Dokumente ---------------------------------------
win32api.SetFileAttributes(zuletztverwendet, win32con.FILE_ATTRIBUTE_NORMAL)  
allefiles = os.listdir(zuletztverwendet + '/')
for af in allefiles:
    if os.path.isfile(zuletztverwendet + '/' + af):        
        try:
            os.remove(zuletztverwendet + '/' + af)                                             # 'Zuletzt verwendete Dokumente' - Ordner leeren
        except:
            pass
win32api.SetFileAttributes(zuletztverwendet,win32con.FILE_ATTRIBUTE_HIDDEN) 
Zuletzt geändert von snakeseven am Mittwoch 31. Januar 2007, 18:28, insgesamt 1-mal geändert.
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 10:57

Nett, aber warum nutzt du nicht die Umgebnungsvariablen, um die Pfade festzustellen?

IMHO ist ein Vergleich mit "<>" unschön, besser: "!=" verwenden.

Außerdem würde ich os.path.join() nutzten.

Im temp-Verz. können auch Unterverzeichnisse vorkommen, du löscht aber nur Dateien.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 31. Januar 2007, 11:36

Und warum so komische Kommentare mit vielen Bindestrichen? Die Inline-Kommentare sind auch hässlich und stören.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Mittwoch 31. Januar 2007, 11:56

In dem Quelltext kommen auch sehr viele Wiederholungen vor, die man in eine oder mehrere Funktionen verlagern könnte. Ungetestet:

Code: Alles auswählen

import win32con, win32api, os


def delete(path, hidden=False, exclude=frozenset()):
    exclude = set(exclude)
    
    if hidden:
        win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
    
    for filename in os.listdir(path):
        if filename not in exclude:
            full_path = os.path.join(path, filename)
            if os.path.isfile(full_path):
                try:
                    os.remove(full_path)
                except IOError:
                    pass
    
    if hidden:
        win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_HIDDEN)


def main():
    home = 'C:/Dokumente und Einstellungen/xx'
    tempinternetpath = os.path.join(home,
                                    'Lokale Einstellungen',
                                    'Temporary Internet Files')
    temppath = os.path.join(home, 'Lokale Einstellungen', 'Temp')
    cookiespath = os.path.join(home, 'Cookies')
    zuletztverwendet = os.path.join(home, 'Recent')

    for args in ((tempinternetpath, True),
                 (temppath,),
                 (cookiespath, False, ['index.dat']),
                 (zuletztverwendet, True)):
        delete(*args)


if __name__ == '__main__':
    main()
Das `hidden`-Argument kann man evt. loswerden, wenn man überprüft, ob das Verzeichnis versteckt ist und darauf entsprechend reagiert.
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Mittwoch 31. Januar 2007, 13:21

Hi zusammen,
Ich habs auf die Schnelle gebastelt, weil die Kiste mal wieder zugemüllt war und XP die Cookies nicht gelöscht hat. Auf Schönheit habe ich dabei nicht geachtet :wink:. Danke aber für die Verbesserungsvorschläge !

Gruss, Seven

Und dann doch eine Frage:
Außer, daß es eleganter aussieht, hat os.path.join() noch andere Vorteile gegenüber der '+' Verknüpfung ?
BlackJack

Mittwoch 31. Januar 2007, 13:54

snakeseven hat geschrieben:Außer, daß es eleganter aussieht, hat os.path.join() noch andere Vorteile gegenüber der '+' Verknüpfung ?
Es funktioniert plattformübergreifend und es fügt, wenn nötig, einen Pfadtrenner ein.

Code: Alles auswählen

In [49]: 'a' + 'b'
Out[49]: 'ab'

In [50]: os.path.join('a', 'b')
Out[50]: 'a/b'

In [51]: os.path.join('a/', 'b')
Out[51]: 'a/b'
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 15:10

Und eine Version von mir:

Code: Alles auswählen

import sys, os, stat

try:
    import win32con, win32api
except ImportError, e:
    print "Import Error:", e
    print "You need win32 from:"
    print "http://sourceforge.net/projects/pywin32/"
    sys.exit()


def delete(path, hidden=False, exclude=frozenset()):
    print "Cleaning:", path
    exclude = set(exclude)

    #~ if hidden:
        #~ win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)

    saved = 0
    count = 0
    for filename in os.listdir(path):
        if filename not in exclude:
            full_path = os.path.join(path, filename)
            if os.path.isfile(full_path):
                try:
                    size = os.stat(full_path)[stat.ST_SIZE]
                    os.remove(full_path)
                except (OSError, IOError), e:
                    print "Error:", e
                else:
                    saved += size
                    count += 1

    print "deleted %s file(s) - %s Bytes" % (count, saved)
    print

    return count, saved

    #~ if hidden:
        #~ win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_HIDDEN)


def main():
    userprofile = os.environ["USERPROFILE"]
    windir = os.environ["WINDIR"]

    paths = (
        {
            "path": os.path.join(
                userprofile, 'Lokale Einstellungen', 'Temporary Internet Files'
            ),
            #~ "hidden": True,
        },
        {
            "path": os.path.join(userprofile, 'Lokale Einstellungen', 'Temp'),
            #~ "hidden": True,
        },
        {
            "path": os.path.join(userprofile, 'Cookies'),
            #~ "hidden": True,
            "exclude": ['index.dat'],
        },
        {
            "path": os.path.join(userprofile, 'Recent'),
            #~ "hidden": True,
        },
        {
            "path": os.path.join(windir, 'Temp'),
            #~ "hidden": True,
        },
        {
            "path": os.environ["temp"],
            #~ "hidden": True,
        },
    )

    total_saved = 0
    total_count = 0
    for kwargs in paths:
        count, saved = delete(**kwargs)
        total_saved += saved
        total_count += count

    print "%s total deleted files - %s Bytes saved" % (total_count, total_saved)


if __name__ == '__main__':
    main()
Wozu eigentlich der hidden Kram??? Der kann doch weg, oder nicht?

Wichtig ist, es gibt noch das temp unter c:\windows und das offizielle temp Verzeichnis ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 18:15

Neue Version, die auch Verzeichnisse samt Inhalt löscht:

Code: Alles auswählen

import sys, os, stat

try:
    import win32con, win32api
except ImportError, e:
    print "Import Error:", e
    print "You need win32 from:"
    print "http://sourceforge.net/projects/pywin32/"
    sys.exit()

cleand_path = []

def delete_dirs(full_path):
    """
    Verzeuchnis mit allen Unterverzeichnis und Dateien löschen.
    """
    print "> delete dir:", full_path
    dirs = [dir for dir,_,_ in os.walk(full_path)]
    dirs.reverse()

    size = 0
    count = 0
    for dir in dirs:
        print dir
        current_count, current_size = delete(dir)
        size += current_size
        count += current_count
        try:
            os.rmdir(dir)
        except OSError, e:
            print "Error:", e

    return count, size

def delete(path, hidden=False, exclude=frozenset()):
    if path in cleand_path:
        # Das Verzeichniss wurde schon einmal gelöscht.
        return (0,0)
    cleand_path.append(path)

    print "Cleaning:", path
    exclude = set(exclude)

    try:
        file_list = os.listdir(path)
    except WindowsError, e:
        print "Error:", e
        print
        return (0,0)

    size = 0
    count = 0
    for filename in file_list:
        if filename in exclude:
            continue

        full_path = os.path.join(path, filename)
        if os.path.isfile(full_path):
            try:
                current_size = os.stat(full_path)[stat.ST_SIZE]
                win32api.SetFileAttributes(
                    full_path, win32con.FILE_ATTRIBUTE_NORMAL
                )
                os.remove(full_path)
            except (OSError, IOError), e:
                print "Error:", e
                current_size = 0
                current_count = 0
            else:
                current_count = 1
        elif os.path.isdir(full_path):
            current_count, current_size = delete_dirs(full_path)

        size += current_size
        count += current_count

    print "deleted %s file(s) - %s Bytes" % (count, size)
    print

    return count, size


def main():
    userprofile = os.environ["USERPROFILE"]
    windir = os.environ["WINDIR"]

    paths = (
        {
            "path": os.path.join(
                userprofile, 'Lokale Einstellungen', 'Temporary Internet Files'
            ),
        },
        {
            "path": os.path.join(userprofile, 'Lokale Einstellungen', 'Temp'),
        },
        {
            "path": os.path.join(userprofile, 'Cookies'),
            "exclude": ['index.dat'],
        },
        {"path": os.path.join(userprofile, 'Recent')},
        {"path": os.path.join(windir, 'Temp')},
        {"path": os.environ["temp"]},
    )

    total_size = 0
    total_count = 0
    for kwargs in paths:
        count, size = delete(**kwargs)
        total_size += size
        total_count += count

    print "%s total deleted files - %s Bytes size" % (total_count, total_size)


if __name__ == '__main__':
    main()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
snakeseven
User
Beiträge: 405
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Mittwoch 31. Januar 2007, 18:34

Hi Jens,
da hast du dich ja richtig reingekniet :oops:
Der Hiddenkram kam dadurch, daß die Dateien in den versteckten Ordnern nicht gelöscht wurden. Werde deine Version mal ausprobieren.

Gruss, Seven
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mittwoch 31. Januar 2007, 18:37

Jens, bitte keine Builtins und Keywords überschreiben.

Zeile 23:

Code: Alles auswählen

for dir in dirs: 
lg
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 31. Januar 2007, 18:45

sape hat geschrieben:Jens, bitte keine Builtins und Keywords überschreiben.

Zeile 23:

Code: Alles auswählen

for dir in dirs: 
lg
warum nicht?
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mittwoch 31. Januar 2007, 18:56

pyStyler hat geschrieben:
sape hat geschrieben:Jens, bitte keine Builtins und Keywords überschreiben.

Zeile 23:

Code: Alles auswählen

for dir in dirs: 
lg
warum nicht?
Weil es sehr schlechter Stil ist das zu machen...
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 31. Januar 2007, 19:21

das ist ja toll aber du hast mich nicht ganz verstanden! Ich denke der Jens weiss das. Dein Kommentar dazu ist also total überflüssi
g.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mittwoch 31. Januar 2007, 19:33

pyStyler hat geschrieben:das ist ja toll aber du hast mich nicht ganz verstanden! Ich denke der Jens weiss das. Dein Kommentar dazu ist also total überflüsis
g.
Sicherlich weiß das Jens. Hab ja auch nichts gengeteiliges behauptet :)


BTW: Deshalb sollte man keine builtins überschrieben:

Code: Alles auswählen

print dir()
dir = '?'
print dir()

Code: Alles auswählen

x = '1'
print int(x)
int = '?'
print int(x)
Das er das nur im Namenspace einer Funktion überschreibt und es nur dort gültig ist, ändert nichts an der Tatsache das es schlechter Stil ist und bleibt.

Und nein, der Kommentar ist nicht überflüssig und auch nicht falsch. Gerade für die Anfänger ist es wichtig das klar zu stellen, sonst kommen die noch auf dumme Gedanken wenn sie sein Code Lesen um daraus zu lernen. -> Siehe nur die ganzen Tutorials zu TKinter wo Stern importe genutzt werden.

BTW: Ich denke Jens versteht das und nimmt es mir nicht übel das ich dass erwähnt habe, da es sicherlich nur ein Schreibfehler von ihm war und er bestimmt nicht möchte das solche Fehler in seinem Code sind die dann als Beispiel dienen.

lg
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 31. Januar 2007, 19:49

sape hat geschrieben:Jens, bitte keine Builtins und Keywords überschreiben.
Zeile 23:

Code: Alles auswählen

for dir in dirs: 
Ups, ganz übersehen ;) Versuche ich eigentlich immer zu vermeiden...

Naja, der code ist eh nicht mehr so super toll...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten