Ordner/Dateien verstecken

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Hallo liebe Community!

Ich bin gerade dabei ein Skript zu schreiben, das viele Konfigurationsdateien im Benutzterverzeichnis erstellt. Nun möchte ich diese Dateien verstecken in dem ich sie in einen Ordner packe und den Ordner "verstecke".

In der Standardbib hab ich leider nichts gefunden, deswegen denke ich wohl, dass ich was eigenes schustern muss. Unter Linux werden Ordner ja mit einem ".name" versteckt. Under Windows hingegen klappt das nicht.

Nun hab ich bisher das gemacht: Nur für den Windowsfall. Den Linuxfall wird bereits mit dem Dateinamen abgedeckt:

Code: Alles auswählen

import os, subprocess, shlex

filename = "test" 

if os.name == "nt":
    args = shlex.split("attrib -h " + filename)
    subprocess.Popen(args)
Wie schreibt ihr euren Betriebsystem abhängigen Code? Geht's noch pytonischer? ;)

Grüße,
anogayales
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Unter Windows gibst doch ein extra Verzeichnis "Anwendungsdaten" o.ä. innerhalb des Benutzer-Ordners? Ich denke der beste Weg wäre es, den Ordner entsprechend dort abzulegen, ohne irgend welche Verrenkungen für das "Verstecken".
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

Stimmt jetzt wo du's sagst! Dazu brauch man doch die win32 api oder?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich hätte mal zunächst in os.environ nachgeguckt. Evtl. bekommt man das auch da her?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der Ordner ist %APPDATA% und unter Linux versteckt man nicht einfach Ordner sondern packt sie in XDG_CONFIG_HOME oder wie auch immer es heisst, zumindest gibt es da einen Freedesktop Standard zu.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

DasIch hat geschrieben:... zumindest gibt es da einen Freedesktop Standard zu.
Hier der Link: http://standards.freedesktop.org/basedi ... 01s03.html

Ich habe unter Ubuntu übrigens kein "$XDG_CONFIG_HOME"; aber da seht ja, wie man es dann handhaben soll :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
anogayales
User
Beiträge: 456
Registriert: Mittwoch 15. April 2009, 14:11

So, ich hab jetzt mal auf die Schnelle was hingezaubert

Code: Alles auswählen

settings_folder = os.path.join(self.get_default_folder(), ".settings")

if os.name == "posix":
    try:
        if os.path.isdir(os.environ["XDG_DATA_HOME"]):
            settings_folder = os.path.join(os.environ["XDG_DATA_HOME"], "Application")
    except KeyError:
        pass
    
if os.name == "nt":
    try:
        if os.path.isdir(os.environ["appdata"]):
            settings_folder = os.path.join(os.environ["appdata"], "Application")
    except KeyError:
        pass
Habt ihr eine bessere Lösung? self.get_default_folder() gibt einem das Home + "Application" dir aus.

Grüße
anogayales
fhoech
User
Beiträge: 143
Registriert: Montag 9. April 2007, 18:26

Vielleicht so? (für Python >= 3 dann das .decode() weglassen)

Code: Alles auswählen

import os
import sys

def get_config_dir(platform=sys.platform, appname="MyApp"):
    dirs = {"darwin": os.path.expandvars("$HOME/Library/Preferences"),
            "linux2": os.getenv("XDG_CONFIG_HOME", 
                               os.path.expandvars("$HOME/.config")),
            "win32": os.getenv("appdata")}
    return os.path.join(dirs[platform].decode(sys.getfilesystemencoding()), 
                        appname)
Antworten