Schrift
[thread]5662[/thread]

Archive-Flag (Win32::File): Archive-Flag löschen

Leser: 2


<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten
weismat
 2003-08-27 00:31
#80614 #80614
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Meinem Verständnis nach kann ich Win32::File benutzen, um das Archive Flag zu lesen und auch zu setzen.
GetAttributes lieftert dabei die Werte:
Quote
returnedAttributes will be set to the OR-ed combination of the filename attributes.

Meinem Verständnis nach sollte
Code: (dl )
$returnedAttributes & ARCHIVE
feststellen, ob das Archive-Flag gesetzt ist. Das scheint auch zu funktionieren.
Wie aber ändere ich nun das Resultat, so dass alle anderen Attribute den gleichen Wert behalten, das Archiv-Flag aber auf 0 gesetzt wird ?
Ich habe
Code: (dl )
$returnedAttributes & (!ARCHIVE)
probiert, aber das funktioniert nicht.
Vielen Dank !
Dubu
 2003-08-27 01:36
#80615 #80615
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Code: (dl )
$returnedAttributes & (~ ARCHIVE)

sollte es tun.
(! => logisches Inverses, ~ => bitweises Inverses)\n\n

<!--EDIT|Dubu|1061933816-->
weismat
 2003-08-27 01:52
#80616 #80616
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Klappt leider nicht.
Beispiel:
Archive hat den Wert 32, wenn eine Datei keine Flags gesetzt hat, ist das Resultat von getAttributes 128, wenn nur das Archive Flag gesetzt ist 32...
Wenn ich den vorgeschlagenen Code benutze kommt 0 raus.
Dubu
 2003-08-27 02:18
#80617 #80617
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Hm. Zumindest mit Zahlen geht es:
Code (perl): (dl )
1
2
3
4
5
6
my $x=160; # 128 + 32
my $y=32;

print ($x & (~ $y));
_ _END_ _
128


(*ARGL* Wann verschwindet endlich der Bug mit den doppelten Unterstrichen. Konnte mal wieder kein richtiges _ _END_ _ eingeben...)
esskar
 2003-08-27 03:21
#80618 #80618
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Dubu,27.08.2003, 00:18](*ARGL* Wann verschwindet endlich der Bug mit den doppelten Unterstrichen. Konnte mal wieder kein richtiges _ _END_ _ eingeben...)[/quote]
war mir gar nicht bekannt...
dachte zuerst, es läge am PerlHighlighter, aber normale [code] tags verschlucken es auch!
Dubu
 2003-08-27 09:36
#80619 #80619
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Es wird sogar im ganz normalen Text verschluckt. Vor allem wird es nicht nur nicht dargestellt, sondern verschwindet dann auch in der Eingabe.
Ich hatte schon mal laut vermutet, dass diese Kombination intern fuer irgendwelche Templates oder so benutzt wird, hab's aber nicht ueberprueft.
weismat
 2003-08-27 10:27
#80620 #80620
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
[quote=Dubu,27.08.2003, 00:18]Hm. Zumindest mit Zahlen geht es:
Code (perl): (dl )
1
2
3
4
5
6
my $x=160; # 128 + 32
my $y=32;

print ($x & (~ $y));
_ _END_ _
128


(*ARGL* Wann verschwindet endlich der Bug mit den doppelten Unterstrichen. Konnte mal wieder kein richtiges _ _END_ _ eingeben...)[/quote]
Der Wert eines Files mit Archive Flag gesetzt ist 32, der Wert ohne gesetztes Archive Flag ist 128.
Ich brauche also eine Operation
32 & ? (32) = 128.
Insofern hinkt Dein Beispiel leider.
Vielleicht habe ich aber auch einfach falsch verstanden, wie das Modul funktioniert. Ich werde nochmals am vollständigen Programm testen, wie es funktioniert.
weismat
 2003-08-27 11:55
#80621 #80621
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Das Modul ist wirklich dämlich...Normal ist mit 128 ein anderer Zustand als Archive mit 32...Dabei hätte ich doch erwartet, daß Normal + Archive den Wert 160 haben sollte...
Dubu
 2003-08-27 12:52
#80622 #80622
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Dann musst du wohl testen, ob nach der Operation 0 herauskommt und das dann auf 128 setzen. (Ich kenne mich leider nicht mit Dateiattributen unter Windows aus, aber vielleicht gibt's dazu ja auch eine erklaerende Doku.)
esskar
 2003-08-27 15:11
#80623 #80623
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
bitte schön

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use Win32::File;
use strict;

my %Win32FileAttrTypes =
(
   FILE_ATTRIBUTE_READONLY => 0x00000001,
   FILE_ATTRIBUTE_HIDDEN => 0x00000002,
   FILE_ATTRIBUTE_SYSTEM => 0x00000004,
   FILE_ATTRIBUTE_DIRECTORY => 0x00000010,
   FILE_ATTRIBUTE_ARCHIVE => 0x00000020,
   FILE_ATTRIBUTE_DEVICE => 0x00000040,
   FILE_ATTRIBUTE_NORMAL => 0x00000080,
   FILE_ATTRIBUTE_TEMPORARY => 0x00000100,
   FILE_ATTRIBUTE_SPARSE_FILE => 0x00000200,
   FILE_ATTRIBUTE_REPARSE_POINT => 0x00000400,
   FILE_ATTRIBUTE_COMPRESSED => 0x00000800,
   FILE_ATTRIBUTE_OFFLINE => 0x00001000,
   FILE_ATTRIBUTE_NOT_CONTENT_INDEXED => 0x00002000,
   FILE_ATTRIBUTE_ENCRYPTED => 0x00004000,
);
my %Win32FileAttrNames = reverse %Win32FileAttrTypes;

my $attr;


Win32::File::SetAttributes("c:\\uhu.pl", $attr | $Win32FileAttrTypes{FILE_ATTRIBUTE_ARCHIVE});

Win32::File::GetAttributes("c:\\uhu.pl", $attr);
DumpAttr($attr);

Win32::File::SetAttributes("c:\\uhu.pl", $attr & ~$Win32FileAttrTypes{FILE_ATTRIBUTE_ARCHIVE});

Win32::File::GetAttributes("c:\\uhu.pl", $attr);
DumpAttr($attr);


sub DumpAttr
{
   my ($attr) = @_;

   foreach (keys %Win32FileAttrNames)
   {
       print "$Win32FileAttrNames{$_}\n" if $attr & $_;
   }
   print "\n";
}
\n\n

<!--EDIT|esskar|1061986234-->
<< |< 1 2 3 >| >> 27 Einträge, 3 Seiten



View all threads created 2003-08-27 00:31.