Ordner bzw. Verzeichnis komprimieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Ordner bzw. Verzeichnis komprimieren

Beitrag von Hoto »

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?
Benutzeravatar
PureFan
Beiträge: 19
Registriert: 10.09.2004 14:40
Kontaktdaten:

Beitrag von PureFan »

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
Um dieses Flag zu setzen muss man leider auf WinAPI zurückgreifen. Details zum Befehl findet man z.B. hier in der MSDN-Hilfe: http://msdn.microsoft.com/library/defau ... ession.asp

[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
Benutzeravatar
Hoto
Beiträge: 294
Registriert: 01.09.2004 22:51

Beitrag von Hoto »

WinAPI war mir schon klar, nur hatte ich wirklich keine Ahnung nach welchem Befehl ich da suchen muss.

Wenn ich das richtig sehe ist der Befehl dafür "DeviceIoControl_"?
Antworten