Cookies und anderen Müll löschen

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
BlackJack

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: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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 ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

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

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

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

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

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

BlackJack hat geschrieben:
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'
Aber Vorsicht:

Code: Alles auswählen

>>> os.path.join('a', '/b')
/b
(Ja, das ist korrekt, aber verwirrend.)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten