Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Attribute unter FreeBASIC ändern(geändert)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 10.11.2005, 22:06    Titel: Attribute unter FreeBASIC ändern(geändert) Antworten mit Zitat

Hi AlleMann,
@programmierer:Paß mal Obacht zwinkern
Ich bin mal mutig in die Tiefen der API-Programmierung getaucht!
Herausgekommen ist ein kleines Progrämmchen, das folgendes kann:
-Read/Only-Attribut setzen/löschen
-Hidden-Attribut setzen/löschen
-System-Attribut setzen/löschen
-Archiv-Attribut setzen/löschen
Directory/Compressed/Normal-Bit lassen sich für Programme nicht
sinnvoll einsetzen, also werden sie ausgeblendet..
Ich kann natürlich nicht verhindern, das jemand den Quelltext für
eigene Zwecke ändert und es dennoch probiert:
Seid ruhig mutig und berichtet von den Erfahrungen, ich hab euch gewarnt zwinkern
Die API-Beschreibungen stammen von:
http://www.activevb.de
und die MsgBox ist der MessageBox von DOSe nicht unähnlich zwinkern
(Meine Anmerkungen hierzu siehe MessageBox-Thread von fbforum.de)
Die Vereinbahrungen hierzu habe ich in die MsgBox.bi ausgelagert, weil
der Programm-Code sich nur mit den Attributen beschäftigen soll.
Code:

Const fbOkOnly = 0            'Nur die Schaltfläche OK anzeigen
Const fbOkCancel = 1          'Schaltflächen OK und Abbrechen anzeigen
Const fbAbortRetryIgnore = 2  'Abbruch, Wiederholen und Ignorieren
Const fbYesNoCancel = 3       'Ja, Nein und Abbrechen
Const fbYesNo = 4             'Schaltflächen Ja und Nein
Const fbRetryCancel = 5       'Schaltflächen Wiederholen und Abbrechen

Const fbCritical = 16         'Stop-Symbol
Const fbQuestion = 32         'Fragezeichen-Symbol
Const fbExclamation = 48      'Ausrufezeichen-Symbol
Const fbInformation = 64      'Information-Symbol

Const fbOK=1                  'Rückgabewert OK
Const fbCancel=2              'Rückgabewert Abbrechen
Const fbAbort=3               'Rückgabewert Abbruch
Const fbRepeat=4              'Rückgabewert Wiederholen
Const fbIgnore=5              'Rückgabewert Ignorieren
Const fbYes=6                 'Rückgabewert Ja
Const fbNo=7                  'Rückgabewert Nein
Const fbNull=0
Declare Function MsgBox Lib "user32" Alias "MessageBoxA" _
   (ByVal hWnd As Integer, ByVal lpText As String, _
   ByVal lpCaption As String, ByVal wType As Integer) As Integer

Die Behandlung der Bits läßt sich sicher anders gestalten, aber ich wollte die
KonstantenNamen benutzen und so ists geworden:
Code:
'$gui
'Ja, fpp kann das kompilieren, eine andere Möglichkeit wäre fbc -s gui FileAttibutes.Bas, Ergebnis ist genauso ;-))
Option Escape
Option Explicit
'$Include: "MsgBox.Bi"
'siehe MessageBox-Thread auf fbforum.de
'Ich habe die Deklarationen in MsgBox.Bi getan, weil es in diesem Programm nur um Attribute gehen sollte
Const FILE_ATTRIBUTE_READONLY=&H1
Const FILE_ATTRIBUTE_HIDDEN=&H2
Const FILE_ATTRIBUTE_SYSTEM=&H4
Const FILE_ATTRIBUTE_DIRECTORY=&H10
Const FILE_ATTRIBUTE_ARCHIVE=&H20
Const FILE_ATTRIBUTE_NORMAL=&H80

Const FILE_ATTRIBUTE_COMPRESSED=&H800
Declare Function GetFAttr Lib "kernel32.dll" Alias "GetFileAttributesA" _
   (ByVal lpFileName As String) As Long
Declare Function SetFileAttribute Lib "kernel32.dll" Alias "SetFileAttributesA" _
   (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Declare Function EvalAttr(Attr As Long) As String

Sub SetFattr(ByRef DateiName As String, ByRef Attr)
  'It's no good idea to set bits higher than archive with a program,
  'because windows uses them for its own purposes, so they are faded out..
  SetFileAttribute DateiName, (GetFAttr(DateiName) And &HFF00)+(Attr And &H2F)
End Sub

Sub ChkBitNew(ByVal FileName As String, ByVal Which As String, WhichBit As Long, ByRef Attr As Long)
  Dim i
  i=MsgBox(fbNull, Which+"\nJa=Setze Bit\nNein=Lösche Bit\nCancel=Nix Ändern", FileName &" " &EvalAttr(Attr), fbYesNoCancel+fbQuestion)
  Select Case i
    Case fbYes: Attr=Attr+WhichBit*IIF((Attr And WhichBit)=0, 1, 0)
    Case fbNo: Attr=Attr-WhichBit*IIF((Attr And WhichBit)<>0, 1, 0)
    Case Else: 'leave Bit as it is..
  End Select
End Sub

Function EvalAttr(Attr As Long) As String
  Dim b$
  If Attr And FILE_ATTRIBUTE_READONLY Then b$=b$+" R"
  If Attr And FILE_ATTRIBUTE_HIDDEN Then b$=b$+" H"
  If Attr And FILE_ATTRIBUTE_SYSTEM Then b$=b$+" S"
  If Attr And FILE_ATTRIBUTE_ARCHIVE Then b$=b$+" A"
  If Attr And FILE_ATTRIBUTE_DIRECTORY Then b$=b$+" D"
  If Attr And FILE_ATTRIBUTE_NORMAL Then b$=b$+" N"
  If Attr And FILE_ATTRIBUTE_COMPRESSED Then b$=b$+" C"
  Function=b$
End Function

Dim As Long Attr
Dim As String FileName
Dim M$(1), s$
M$(0)="Nein"
M$(1)="Ja"
FileName=Environ$("Tmp")+"\\Test.All"
s$="Eintrag : "+FileName
Attr=GetFAttr(FileName)
If Attr>=0 Then
  s$=s$+"\nAttribut(ald):"+Hex$(Attr)+EvalAttr(Attr)+"\n"
  ChkBitNew FileName, "Setze NurLesen-Bit?", FILE_ATTRIBUTE_READONLY, Attr
  ChkBitNew FileName, "Setze Versteckt-Bit?", FILE_ATTRIBUTE_HIDDEN, Attr
  ChkBitNew FileName, "Setze System-Bit?", FILE_ATTRIBUTE_SYSTEM, Attr
  ChkBitNew FileName, "Setze Archiv-Bit?", FILE_ATTRIBUTE_ARCHIVE, Attr
  SetFAttr FileName, Attr
  Attr=GetFAttr(FileName)
  s$=s$+"\nAttribut(neu):" &(Hex$(Attr)) &EvalAttr(Attr)
Else
  s$=s$ &" nicht gefunden.. " &Attr
End If

MsgBox fbNull, s$, "Admin-Info", fbExclamation
'Sleep 'wird nur benötigt, wenn das Programm nicht mit '$gui (bei fpp) oder fbc -s gui FileAttribute.Bas (bei fbc) kompiliert wird
End

Ich habe diesen Code unter FB0.15b vom 26.10.2005 getestet und nur an Einträgen, die
ich extra dafür angelegt habe, bei diesen funktionierts zwinkern
Bis denn denn und viele Grüße
ytwinky
[Edit]Das Hauptprogramm bietet nun nicht mehr an, Attribute von nicht vorhandenen Einträgen zu bearbeiten..
..hier nun die versprochenene Exists-Function:
Code:
Option Explicit
Declare Function GetFAttr Lib "kernel32.dll" Alias "GetFileAttributesA" _
   (ByVal lpFileName As String) As Long
Declare Function Exists(FileName As String) As Long
Declare Function FileExists(FileName As String) As Long
Declare Function ExistsFolder(FileName As String) As Long

Function Exists(FileName As String) As Long
  Const DIRECTORY_BIT=&H04
  Dim Attribut=GetFAttr(FileName)
  Function=IIF(Attribut<0, 0, Bit(Attribut, DIRECTORY_BIT)+2)
  '2=Datei vorhanden, 1=Directory vorhanden, 0=Nix gefunden
End Function

Function FileExists(FileName As String) As Long
  Function=Exists(FileName)=2
End Function

Function FolderExists(FolderName As String) As Long
  Function=Exists(FolderName)=1
End Function

Sub Bewerte(ByVal FileName As String)
  ?FileName &"=>" &Exists(FileName)
  ?"Datei gibt es ";
  If Not FileExists(FileName) Then ?"nicht" Else ?
  ?"Directory gibt es ";
  If Not FolderExists(FileName) Then ?"nicht" Else ?
End Sub

Dim As String FileName
Bewerte(Environ$("Tmp") &"\\Test.All")
Bewerte(Environ$("Tmp") &"\\Test1.All")
Bewerte(Environ$("Tmp") &"\\TestZ.All")
?"..und eine Garantie gibt es sowieso nicht..;-))"
?"l„uft unter FB0.15b"
Sleep
Hat ein büschen gedauert, läuft aber..
Grüße
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..

Zuletzt bearbeitet von ytwinky am 10.12.2005, 19:48, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 22.11.2005, 18:01    Titel: Antworten mit Zitat

Hey, cool!!
Danke!

Hab ich garnicht gesehen. Habe auch ne andere sehr schlechte Variante gefunden, mit shell "attrib blabla". Aber deine Variante ist genau das, was ich gesucht habe. Klappt perfekt.

Nochmal THX für die Mühe.

Michael
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 23.11.2005, 18:14    Titel: Antworten mit Zitat

Hi programmierer,
äääh, wenn ich ehrlich sein soll, habe ich das eher für mich gemacht zwinkern
Daß da nebenbei für dich eine brauchbare Lösung entsteht, war ein erwünschter Nebeneffekt..
Aber deine Rückmeldung freut mich!
Viele Grüße
ytwinky
_________________
v1ctor hat Folgendes geschrieben:
Yeah, i like INPUT$(n) as much as PRINT USING..
..also ungefähr so, wie ich GOTO..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz