Attribute eines Files extrahieren und setzen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Attribute eines Files extrahieren und setzen

    Hi,

    ich möchte die Attribute eines Files auslesen, S H R und A

    Am einfachsten scheint mir das über die File Info zu gehen. Das Attribut IsReadOnly kann man direkt auslesen. Aber für die anderen Attribute muss man wohl die Property .Attributes zussammen mit der ENUM FileAttributesverwenden.

    Gesagt getan, so hab ich das versucht:

    VB.NET-Quellcode

    1. Dim myInfo As New FileInfo(DateTimeRealObject)
    2. If (myInfo And FileAttributes.System) = FileAttributes.System Then txtSOld.Text = "S"c


    Das klappt leider nicht:

    Fehler BC30452 Der And-Operator ist für die Typen "FileInfo" und "FileAttributes" nicht definiert.

    Na gut, das verstehe ich ja noch. Aber so sehr ich mich auch winde und drehe, ich kriege keine passende Conversion hin !

    Kann mir jemand nachsichtig helfen?

    LG
    Peter
    @~blaze~ Jou.
    @Peter329 Mach es einfach so, nutze das <Flags>-Attribut des Enums:

    VB.NET-Quellcode

    1. If (myInfo.Attributes.HasFlag(FileAttributes.System)) Then txtSOld.Text = "S"

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Erst mal schönen Dank für eure Antworten.

    Also die Sache mit .HasFlag() funktioniert problemlos. Damit ist mein Problem erst mal gelöst.

    Da ich aber gern was lerne, würden ich den Vorschlag von @blaze verstehen wollen:

    du rufst die Attributes-Eigenschaft nicht ab, sondern operierst direkt auf der FileInfo.


    Wie soll das denn gehen ? Ich hab mir FileInfo und FileAttributes im ObjectExplorer angeschaut. Und da finde ich außer der Eigenschaft IsReadOnly nix, was ich bezüglich der Attibute System, Hidden und Archive direkt ansprechen könnte. (s. Anhang)

    Kann schon sein, dass ich wieder mal blöde bin ... für nachsichtige Hinweise wäre ich dankbar.

    LG
    Peter
    Bilder
    • s 2017-04-22 12-10-173.jpg

      145,83 kB, 1.227×802, 66 mal angesehen
    • s 2017-04-22 12-12-571.jpg

      128,3 kB, 1.217×735, 67 mal angesehen
    Schau' dir mal deinen Code an:

    VB.NET-Quellcode

    1. Dim myInfo As New FileInfo(DateTimeRealObject)
    2. If (myInfo And FileAttributes.System) = FileAttributes.System Then txtSOld.Text = "S"c

    myInfo ist das FileInfo-Objekt, das du erstellt hast. Im nächsten Schritt operierst du auf myInfo und nicht auf, wie von dir gewünscht, myInfo.Attributes. Aus diesem Grund funktioniert auch der Code, den dir RodFromGermany gegeben hat. Dort wird ebenfalls auf der Attributes-Eigenschaft des myInfo-Objekts operiert.

    Übrigens noch eine Randnotiz bzgl. txtSOld.Text = "S"c: Du solltest an dieser Stelle möglicherweise "S" statt "S"c schreiben, da txtSOld.Text sowieso einen String erwartet (ich weiß nicht, ob der Compiler das automatisch wegoptimiert) und es daher keiner Konvertierung bedarf.

    Viele Grüße
    ~blaze~
    Das ist mir schon klar, dass mein Code nicht funktioniert .... ich vergleiche da Äpfel mit Birnen.

    Ich hatte deine Anmerkung dahingehend falsch verstanden, dass es Möglichkeiten gibt mit den Eigenschaften von FileInfo direkt zu arbeiten. Das ist wohl nicht der Fall.

    Mit anderen Worten .... an der Lösung von RFG führt kein Weg vorbei !

    Ihr habt mir sehr geholfen. Recht herzlichen Dank noch einmal und

    LG
    Peter
    ... jetzt hab ich aber doch noch eine Frage:

    Wie kann ich denn jetzt die Attribute eines Files setzen ? Also ich hätte da eine Methode .SetFlag vermutet ... aber ich finde nichts in dieser Hinsicht !

    Und weiterhin ist dann ja noch die Frage, wie man das Zeug zurückschreibt ? Auch da finde ich erst mal nix passendes ...

    LG
    Peter
    @Peter329 So was:

    VB.NET-Quellcode

    1. Dim DateTimeRealObject = "c:\temp\Test.jpg"
    2. Dim myInfo As New FileInfo(DateTimeRealObject)
    3. MessageBox.Show(myInfo.Attributes.ToString())
    4. myInfo.Attributes = myInfo.Attributes Or FileAttributes.ReadOnly
    5. MessageBox.Show(myInfo.Attributes.ToString())
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ok, jetzt habe ich es endlich geschnallt ... ich muss statt myInfo den Ausdruck myInfo.Attributesverwenden. Da hatte ich einfach einen längeren Blackout! :)

    So flutscht die Sache jetzt !

    Nochmals herzlichen Dank !

    LG
    Peter