Delphi-PRAXiS
Seite 1 von 6  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi NTFS-Komprimierung einer einzelnen Datei? (https://www.delphipraxis.net/197883-ntfs-komprimierung-einer-einzelnen-datei.html)

PeterPanino 14. Sep 2018 14:19

NTFS-Komprimierung einer einzelnen Datei?
 
Hallo und schönes Wochenende!

Ich wollte mit
Delphi-Quellcode:
TFile.SetAttributes
das Dateiattribut
Delphi-Quellcode:
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?

PeterPanino 14. Sep 2018 14:24

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Aha. Ich habe den
Code:
/c
switch vergessen. Damit funktioniert es.

PeterPanino 14. Sep 2018 14:44

AW: NTFS-Komprimierung einer einzelnen Datei?
 
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?

himitsu 14. Sep 2018 14:52

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Zitat:

Zitat von PeterPanino (Beitrag 1413190)
Ich wollte mit
Delphi-Quellcode:
TFile.SetAttributes
das Dateiattribut
Delphi-Quellcode:
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.

PeterPanino 14. Sep 2018 15:13

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Zitat:

Zitat von himitsu (Beitrag 1413202)
Verschlüsselung, Kompression und andere "Attribute" sind da nur als Information (ReadOnly) enthalten.

Habe ich ja sinngemäß geschrieben, dass ich deswegen compact verwende.

himitsu 14. Sep 2018 15:21

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Was Compact intern macht, bzw. was man selber ausführen kann, wird dort auch genannt. :angle:

PeterPanino 14. Sep 2018 15:28

AW: NTFS-Komprimierung einer einzelnen Datei?
 
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.

PeterPanino 14. Sep 2018 15:38

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Ü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.

KodeZwerg 14. Sep 2018 16:05

AW: NTFS-Komprimierung einer einzelnen Datei?
 
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.

PeterPanino 14. Sep 2018 18:31

AW: NTFS-Komprimierung einer einzelnen Datei?
 
Zitat:

Zitat von KodeZwerg (Beitrag 1413213)
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?

Zitat:

Zitat von KodeZwerg (Beitrag 1413213)
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:

Delphi-Quellcode:
ShellExecEx('compact', '/c "' + AFile + '"', '', SW_HIDE);


Und das ist zum Verschlüsseln:

Delphi-Quellcode:
ShellExecEx('cipher', '/e /a "' + AFile+ '"', '', SW_HIDE);


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 1 von 6  1 23     Letzte »    

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