Vom Dateityp zur Dateiendung

  • Hallo o/

    Hat jemand eine Idee wie ich von dem Dateityp zu der eigentlichen Dateiendung komme? Dieser Screenshot soll das einmal verdeutlichen:

    Ich habe hier den Dateityp "Textdokument" von welchen ich die Dateiendung "*.txt" ableiten will. Weiß jemand wo Windows diese Informationen speichert?


    €dit: Vielleicht noch was zum eigentlichen Hintergrund. Ich habe leider nur die Informationen zur Verfügung, welche im ArrayDisplay angezeigt werden. Daraus möchte ich den vollen Dateipfad ableiten. Es ist sichergestellt, dass diese Dateien IMMER auf dem Desktop liegen. Ich dachte mir, die beste und sicherste Möglichkeit währe über den Dateityp.

    Einmal editiert, zuletzt von Yjuq (26. Januar 2019 um 18:02)

  • Ich verstehe das Problem nicht ganz.
    Wenn Du dn Typ extrahieren kannst, dann kannst Du doch auch den Pfad extrahieren und dann die Erweiterung (".txt") aus dem Pfad herausholen.
    Wie erstellt Du das angezeigte Array? Poste mal den Code.

  • Code
    ; Ggf. deaktivieren wenn das OS ein 32-Bit System ist.
    #AutoIt3Wrapper_UseX64=y
    
    #include <Array.au3>
    #include <GuiListView.au3>
    
    Local $desktop = ControlGetHandle("[TITLE:Program Manager;CLASS:Progman]", "", 1)
    
    $tmp = _GUICtrlListView_GetItemTextArray($desktop, 0) ; Item anpassen
    _ArrayDisplay($tmp)

    Well, das ist der minimalisierte Code wie ich an das Array dran komme.

    Das Problem ist, dass ich erst gar nicht den Pfad habe. Dennoch brauche ich Ihn für die weitere Verarbeitung in meinem Programm. :P

    Sagte doch, dass ich nur die Informationen aus dem ArrayDisplay habe.

    Einmal editiert, zuletzt von Yjuq (26. Januar 2019 um 19:04)

  • Hat jemand eine Idee wie ich von dem Dateityp zu der eigentlichen Dateiendung komme?

    Das Problem ist, dass ich erst gar nicht den Pfad habe. Dennoch brauche ich Ihn für die weitere Verarbeitung in meinem Programm.

    So wird das aber nix, denn schau hier:

    Code
    M:\>assoc|find "Textdokument"
    .dic=Textdokument
    .exc=Textdokument
    .scp=Textdokument
    .txt=Textdokument
    
    M:\>ftype|find "Textdokument"
    Textdokument=C:\WINDOWS\system32\NOTEPAD.EXE %1

    oder hier mit AutoIt...

    • Offizieller Beitrag

    Ich halte das ganze Unterfangen für nicht erfolgversprechend. Dateierweiterungen haben nur bedingt etwas mit dem Inhalt zu tun. Das beste Bsp. ist doch *.au3. Je nachdem, wie du es installiert hast, wird die Datei als Text zum Bearbeiten im Editor betrachtet oder als 'AutoIt'-Datei die mit Interpreter ausgeführt wird.

    Ganz zu Schweigen von frei vergebenen Dateiendungen, die der Entwickler z.B. als Ansammlung binärer Zeichen in eine Datei schreibt, die nur er auslesen kann.

  • Es geht mit ja auch nicht um den Inhalt. Der Inhalt der einzelnen Dateien ist mir komplett egal, ich brauche lediglich eine zuverlässige Methode um den Dateipfad zu ermitteln damit ich diese Dateien wo anders von dem Desktop hin verschieben kann. Später sollen diese wieder an ihrer alten Desktop Position hergestellt werden. Darum greife ich auch per ListView Befehlen auf den Desktop zu.

    Ich schreibe eine Applikation für mehrere virtuelle Desktops wo entsprechend die Desktop Items getauscht werden, je nachdem welchen Desktop man gerade betrachtet. Das ganze muss als Konsolenprogramm funktionieren, weshalb die bisherigen Programme die ich im Internet gefunden habe nicht in Frage kommen.

    Der Pfad soll zur eindeutigen Identifikation dienen. Es können mehrere Dateien auf dem Desktop liegen welche den gleichen Namen, aber nicht die gleiche Dateiendung haben. Dateiname + Dateiendung ist immer eindeutig.

    €dit: Oder stehe ich komplett auf den Schlauch und das Problem lässt sich anders angehen / lösen?

    Einmal editiert, zuletzt von Yjuq (26. Januar 2019 um 22:14)

  • Sie kommen vom Desktop. Zumindest unter Windows 10 64-Bit. Welches System nutzt du? Ggf. mal mit den zweiten Parameter von _GUICtrlListView_GetItemTextArray() herum spielen.

    #AutoIt3Wrapper_UseX64=y entsprechend notwendig wenn du ebenfalls ein 64-Bit System nutzt, andersfalls auf "n" setzen.

    Könnte aber auch sein, dass bei dir ControlGetHandle("[TITLE:Program Manager;CLASS:Progman]", "", 1) nichts zurück gibt?

    • Offizieller Beitrag

    Mein Desktop ist dafür zu nackig. Habe gerade nachgesehen - meine Links/Dateien sind nicht auf dem User-Desk, sondern immer auf Admin Public. (Diesen Fall solltest du dann wohl auch berücksichtigen, wenn es allgemeingültig werden soll).

    Hiermit könntest du Glück haben:

  • Hallo!

    Schau mal in die Registierung unter HKEY_CLASSES_ROOT. Dort hast Du alle Dateitype die Assoziiert werden...

    vielleicht ist es das was Du suchst!

    lg

    Racer

  • Versteh das Problem ehrlich gesagt nicht so ganz.

    Um eine Liste und Pfade aller Dateien des Desktops zu bekommen benötigt man lediglich die Funktion _FileListToArray. Hier kann man bei Bedarf auch nach Dateien / Ordnern und bestimmten Dateiendungen wie "*.txt" filtern, oder aber man wertet das Array eben selbst aus wenn auch Dateien mit anderen Endungen verschoben werden sollen.

    Um die Pfade für den eigenen Desktop / AllUser Desktop oder auch Desktop eines spezifischen Users zu ermitteln sind folgende Makros hilfreich:

    Code
    @DesktopDir
    @DesktopCommonDir

    Der Userspezifische Desktop liegt normalerweise immer unter "C:\Users\BENUTZERNAME\Desktop".

    Ahja und dir sollte natürlich klar sein, dass dein Script Administratorrechte benötigt, wenn es den Desktop bzw. den Benutzerordner eines anderen Nutzers verändern soll.

  • Versteh das Problem ehrlich gesagt nicht so ganz.


    Um eine Liste und Pfade aller Dateien des Desktops zu bekommen benötigt man lediglich die Funktion _FileListToArray. Hier kann man bei Bedarf auch nach Dateien / Ordnern und bestimmten Dateiendungen wie "*.txt" filtern, oder aber man wertet das Array eben selbst aus wenn auch Dateien mit anderen Endungen verschoben werden sollen.


    Um die Pfade für den eigenen Desktop / AllUser Desktop oder auch Desktop eines spezifischen Users zu ermitteln sind folgende Makros hilfreich:

    Das hatte ich bereits in der SB vorgeschlagen, aber es geht wohl um den Zugriff auf das Desktopcontrol.

    Meiner Meinung nach kann man diesen Teil aber hervorragend über die entsprechenden Funktionen auslagern.

    Wenn man nun auch noch das Datum vergleicht (oder die Größe) hat man die richtige Datei (bei verschiedenen Endungen aber dem gleichen Typen).

  • Zitat

    Meiner Meinung nach kann man diesen Teil aber hervorragend über die entsprechenden Funktionen auslagern.

    Das hatte ich ursprünglich auch erst vor, jedoch bin ich auf einige Probleme gestoßen. Die Desktop Icons haben eine bestimmte Position auf dem Desktop, wodurch sie auch eine bestimme ID (bzw. Item Index) im ListView bekommen. das Problem ist, wenn ich nun einfach die Dateienliste des Desktops einlese, entspricht das nicht der Reihenfolge der einzelnen Desktop Symbole. das heißt ich brauche eine Verbindung zwischen dem eigentlichen Icon und deren Position sowie dem entsprechenden Dateipfad. Leider bekomme ich aber nur die Informationen aus dem ListView extrahiert, welche ich im ersten Post als Screenshot dargelegt habe. BugFix seine Variante hilft mir enorm, zusammen mit dem Datumsvergleich (ggf. mit der Dateigröße dazu) dürften keine doppelten Einträge erkannt werden. Das war so das Hauptproblem an der Geschichte.

    Der reine Namensvergleich + Datumsvergleich + Größe hätte Potentiell immernoch doppelte Einträge durchgelassen. Zusammen mit der Typ Überprüfung ist eine genauere Unterteilung auf dieser Weise dann schon nicht mehr möglich. Potentiell besteht zwar immernoch die Gefahr dazu, sie ist aber so minimal wie möglich gehalten. Das reicht mir (vorerst) so aus.

  • Hat aber nichts mit der Eigenschaft "Typ" zu tun (Textdokument o.ä.). Wie man das abfragen kann habe ich ja in Beitrag #10 gezeigt.

    Doch doch. Genau das steht schon in HKEY_CLASSES_ROOT.

    Erst in Zweig ".txt" . Dort steht im Standard-Wert "txtfile". Also in den Zweig "txtfile" switchen. Dann findet man im Standard-Wert den Dateityp ausgeschrieben - allerdings in englisch: "Text Document".

    Für diesen String muss man noch die Übersetzung ermitteln. (glaube >>hier<< und >>hier<< findet man den Weg wie es geht)

    Deine Methode macht diese Schritte halt implizit schon aber die Quelle hierfür ist tatsächlich HKEY_CLASSES_ROOT.