Ordner bzw. Verzeichnis komprimieren
Ordner bzw. Verzeichnis komprimieren
Ich würde gern einen Ordner auf einer NTFS Partition von PureBasic aus das Atribut zur Kompriemierung des Inhalts setzen (also damit ich anschliessend in das erzeugte Verzeichniss Dateien reinkopieren kann, die direkt vom NTFS Filesystem gepackt werden (blaue Dateinamen). Irgendwie krieg ich das nicht hin, dumm das es dafür kein PureBasic Befehl gibt (warum eigentlich? Man kann die Atribute zwar auslesen, aber nicht setzen, wenn man doch normal solche Befehle einbaut, macht man doch gleich den gegenteiligen Befehl gleich mit?). Leider konnte ich dazu nirgends was gescheites finden. Lösung?
Code: Alles auswählen
#FSCTL_SET_COMPRESSION = $9C040
#COMPRESSION_FORMAT_NONE = 0
#COMPRESSION_FORMAT_DEFAULT = 1
#COMPRESSION_FORMAT_LZNT1 = 2
Procedure SetCompression(FileName.s,CompressionFormat,IsDirectory)
if IsDirectory:flags=#FILE_FLAG_BACKUP_SEMANTICS:Else:flags=0:EndIf
h = CreateFile_(FileName.s,#GENERIC_READ|#GENERIC_WRITE, 0, 0, #OPEN_EXISTING, flags, 0)
if h<>-1
result= DeviceIoControl_(h,#FSCTL_SET_COMPRESSION, @CompressionFormat, 4, 0, 0, @dw, 0)
CloseHandle_(h)
ProcedureReturn result
endif
EndProcedure
if SetCompression("c:\test.txt",#COMPRESSION_FORMAT_LZNT1,0)
Debug "Kompression aktiviert"
Delay(5000) ;5 sek warten
if SetCompression("c:\test.txt",#COMPRESSION_FORMAT_NONE,0)
Debug "Kompression deaktiviert"
endif
else
debug "Kompression konnte nicht aktiviert werden.. Datei nicht gefunden oder kein NTFS-System"
endif
[EDIT] Code oben angepasst.. Wenn man das Flag für ein Verzeichnis setzen will, einfach als 3. Parameter 1 übergeben
Procedure x(a,b,c):If a:ProcedureReturn b:EndIf:ProcedureReturn c:EndProcedure:For I=0 To 6:T.s+Chr(I&1+x(((I&4)/4+(I&2)/2-I&1+1)&6,1,0)<<1+x(I&1-(I&4)/4,1,0)<<2+x((I+2)&7,0,1)<<3+((4-(I+1)&4)/4)<<4+x(3-(I+3)&3,1,0)<<5+64):Next I:Debug T