AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi NTFS-Komprimierung einer einzelnen Datei?
Thema durchsuchen
Ansicht
Themen-Optionen

NTFS-Komprimierung einer einzelnen Datei?

Ein Thema von PeterPanino · begonnen am 14. Sep 2018 · letzter Beitrag vom 15. Sep 2018
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15:19
Hallo und schönes Wochenende!

Ich wollte mit TFile.SetAttributes das Dateiattribut faCompressed einer einzelnen Datei setzen, aber es funktionierte nicht.

Dann las ich:

Zitat:
It is not possible to change the compression status of a File object using the SetAttributes method.
So versuchte ich in der cmd-Konsole:

Code:
compact "C:\meintest\meineapp.exe"
Aber es funktionierte nicht. Die Konsole meldete zurück:

Code:
1603048 :  1603048 = 1,0 zu 1   meineapp.exe

Von 1 Dateien in 1 Verzeichnissen sind
0 komprimiert und 1 nicht komprimiert.
1.603.048 Datenbytes insgesamt werden in 1.603.048 Bytes gespeichert.
Das Komprimierungsverhältnis ist 1,0 zu 1.
Was könnte die Ursache dafür sein? Wie kann man die NTFS-Komprimierung dieser Datei mit Delphi bzw. programmatisch durchführen?
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15:24
Aha. Ich habe den
Code:
/c
switch vergessen. Damit funktioniert es.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15:44
Wenn man den compact-Befehl für eine Datei ausführt, die bereits NTFS-komprimiert ist, so scheint nichts zu passieren.

Man braucht also offensichtlich nicht vorher zu prüfen, ob die Datei nicht NTFS-komprimiert ist?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15:52
Ich wollte mit TFile.SetAttributes das Dateiattribut faCompressed einer einzelnen Datei setzen, aber es funktionierte nicht.
Ich würde empfehlen die Dokumentaion zu lesen, denn da steht was zu machen ist.
MSDN-Library durchsuchenSetFileAttributes

Verschlüsselung, Kompression und andere "Attribute" sind da nur als Information (ReadOnly) enthalten.

Genauso das FILE_ATTRIBUTE_NORMAL, welches nur dafür da ist, um "kein Atribut gesetzt" von "Fehler" unterscheiden zu können, da sonst beides 0 wäre.
$2B or not $2B

Geändert von himitsu (14. Sep 2018 um 16:00 Uhr)
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 16:13
Verschlüsselung, Kompression und andere "Attribute" sind da nur als Information (ReadOnly) enthalten.
Habe ich ja sinngemäß geschrieben, dass ich deswegen compact verwende.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 16:21
Was Compact intern macht, bzw. was man selber ausführen kann, wird dort auch genannt.
$2B or not $2B
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 16:28
Seltsamerweise funktioniert dein Link für mich nicht:

Zitat:
Something went wrong and we can't sign you in right now. Please try again later.
The Microsoft account login server has detected too many repeated authentication attempts. Please wait a moment and try again.
Hab ich noch nie gesehen.
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 16:38
Übrigens funktioniert das Setzen auch von "einfachen" Dateiattributen von Dateien in geschützten Verzeichnissen wie "C:\Program Files (x86)\..." natürlich nur mit Administrator-Privilegien.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 17:05
Da ich garantiert vom TE falsch verstanden werde, Versuche ich es erst gar nicht zu Erklären sondern gebe nur ein Sample.
Delphi-Quellcode:
const
  COMPRESSION_FORMAT_NONE = 0;
  COMPRESSION_FORMAT_DEFAULT = 1;
  COMPRESSION_FORMAT_LZNT1 = 2;

procedure SetCompressionAttribute(const FileName: string; const CompressionFormat: USHORT);
const
  FSCTL_SET_COMPRESSION = $9C040;
var
  Handle: THandle;
  Flags: DWORD;
  BytesReturned: DWORD;
begin
  if DirectoryExists(FileName) then
    Flags := FILE_FLAG_BACKUP_SEMANTICS
  else if FileExists(FileName) then
    Flags := 0
  else
    raise Exception.CreateFmt('%s does not exist', [FileName]);

  Handle := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, Flags, 0);
  if Handle=0 then
    RaiseLastOSError;
  if not DeviceIoControl(Handle, FSCTL_SET_COMPRESSION, @CompressionFormat, SizeOf(Comp), nil, 0, BytesReturned, nil) then
  begin
    CloseHandle(Handle);
    RaiseLastOSError;
  end;
  CloseHandle(Handle);
end;
So könntest Du Dateien mit NTFS Komprimieren.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 19:31
Da ich garantiert vom TE falsch verstanden werde, Versuche ich es erst gar nicht zu Erklären sondern gebe nur ein Sample.
Fühlst du dich häufig falsch verstanden?

Delphi-Quellcode:
const
  COMPRESSION_FORMAT_NONE = 0;
  COMPRESSION_FORMAT_DEFAULT = 1;
  COMPRESSION_FORMAT_LZNT1 = 2;

procedure SetCompressionAttribute(const FileName: string; const CompressionFormat: USHORT);
const
  FSCTL_SET_COMPRESSION = $9C040;
var
  Handle: THandle;
  Flags: DWORD;
  BytesReturned: DWORD;
begin
  if DirectoryExists(FileName) then
    Flags := FILE_FLAG_BACKUP_SEMANTICS
  else if FileExists(FileName) then
    Flags := 0
  else
    raise Exception.CreateFmt('%s does not exist', [FileName]);

  Handle := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, Flags, 0);
  if Handle=0 then
    RaiseLastOSError;
  if not DeviceIoControl(Handle, FSCTL_SET_COMPRESSION, @CompressionFormat, SizeOf(Comp), nil, 0, BytesReturned, nil) then
  begin
    CloseHandle(Handle);
    RaiseLastOSError;
  end;
  CloseHandle(Handle);
end;
So könntest Du Dateien mit NTFS Komprimieren.
Sehr interessant!

Aber welchen Vorteil hat das, außer dass es viel komplizierter und fehleranfälliger ist?

Das hier ist viel einfacher:

ShellExecEx('compact', '/c "' + AFile + '"', '', SW_HIDE);

Und das ist zum Verschlüsseln:

ShellExecEx('cipher', '/e /a "' + AFile+ '"', '', SW_HIDE);
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 6  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz