Seite 1 von 1

Cookies und anderen Müll löschen

Verfasst: Mittwoch 31. Januar 2007, 10:21
von snakeseven
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) 

Verfasst: Mittwoch 31. Januar 2007, 10:57
von jens
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.

Verfasst: Mittwoch 31. Januar 2007, 11:36
von Leonidas
Und warum so komische Kommentare mit vielen Bindestrichen? Die Inline-Kommentare sind auch hässlich und stören.

Verfasst: Mittwoch 31. Januar 2007, 11:56
von 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.

Verfasst: Mittwoch 31. Januar 2007, 13:21
von snakeseven
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 ?

Verfasst: Mittwoch 31. Januar 2007, 13:54
von 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'

Verfasst: Mittwoch 31. Januar 2007, 15:10
von jens
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 ;)

Verfasst: Mittwoch 31. Januar 2007, 18:15
von jens
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()

Verfasst: Mittwoch 31. Januar 2007, 18:34
von snakeseven
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

Verfasst: Mittwoch 31. Januar 2007, 18:37
von sape
Jens, bitte keine Builtins und Keywords überschreiben.

Zeile 23:

Code: Alles auswählen

for dir in dirs: 
lg

Verfasst: Mittwoch 31. Januar 2007, 18:45
von pyStyler
sape hat geschrieben:Jens, bitte keine Builtins und Keywords überschreiben.

Zeile 23:

Code: Alles auswählen

for dir in dirs: 
lg
warum nicht?

Verfasst: Mittwoch 31. Januar 2007, 18:56
von sape
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...

Verfasst: Mittwoch 31. Januar 2007, 19:21
von pyStyler
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.

Verfasst: Mittwoch 31. Januar 2007, 19:33
von sape
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

Verfasst: Mittwoch 31. Januar 2007, 19:49
von jens
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...

Verfasst: Mittwoch 31. Januar 2007, 19:53
von birkenfeld
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.)