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 2  1 2      
Benutzerbild von himitsu
himitsu
Online

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15:21
Was Compact intern macht, bzw. was man selber ausführen kann, wird dort auch genannt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
PeterPanino

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15: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.472 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 15: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
 
#4

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 16: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.472 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 18: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
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 18:48
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?
Nicht das ich wüßte, ich schreibe keine Anekdoten als Antwort mit esoterischen Lebensinn gebrabbel wenn es ums Thema Delphi geht.
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);
"Einfacher" ist eine persönliche Meinung die ich hier nicht reinfliessen lassen möchte, da ich mit Delphi programmiere verwende ich auch Delphi dazu.
Vorteile kann ich Dir keine nennen, da unser Jing und Jang nicht kompatibel ist, wären meine Vorteile = Deine Nachteile.
Ich kann da auch anderen Code schreiben über WMI der genauso untergeht da ja ein externes Programm zu starten viel besser ist.

Fehleranfälliger? Also ich geh wenigstens auf Fehler ein, Du startest nur was ohne es auszuwerten, das ist also besser? Rhetorische Frage bedarf keiner Antwort.

Schön das Du es so regelst, das ist eine Super Idee so. Noch einen schönen Abend wünsche ich Dir.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
PeterPanino

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 19:10
Sei mal ehrlich: Was ist dir denn über die Leber gekrochen?

So viele Vorwürfe: Du machst das und ich mach das.

Wovon kommen diese vielen verbittert klingenden Vorwürfe?

Kannst du mir das verraten? Würde mich EHRLICH interessieren! Oder ist das ein Staatsgeheimnis?

Oder hat das was damit zu tun, dass dein Jing angeblich besser als mein Jang ist?

Wieso verachtest du mein Jang? (Entschuldige, aber du hast damit angefangen).

Aber ich wünsche noch einen schönen Freitagabend!

Geändert von PeterPanino (14. Sep 2018 um 19:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 20:12
Aber welchen Vorteil hat das, außer dass es viel komplizierter und fehleranfälliger ist?
Direkt das machen, was man will, ohne Umwege und externe Abängigkeiten.

Ordentliche Fehlerprüfung.
Nja, wenn man es richtig machen würde, denn was steht bei MSDN-Library durchsuchenCreateFile im Abschnitt "Return Value"? (Tipp: es ist keine Null)
Gut, das geht in gewissem Umfang auch mit dem Programmaufruf, aber da müsstest du auch den ExitCode und eventuell auch den StrOut/ErrOut des Programms auswerten.
Ein Therapeut entspricht 1024 Gigapeut.

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

Registriert seit: 4. Sep 2004
1.472 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 21:28
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.
Noch eine Frage: Was machst du, wenn die Datei sich in einem für normale User nicht beschreibbaren Verzeichnis befindet? (z.B. C:\Program Files (x86)\...).

In diesem Fall habe ich diese Fehlermeldung erhalten:

Zitat:
---------------------------
System Error. Code: 6.

Das Handle ist ungültig.
---------------------------
OK
---------------------------
Was machst du dann? Würde mich sehr interessieren.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: NTFS-Komprimierung einer einzelnen Datei?

  Alt 14. Sep 2018, 22:08
Was machst du dann? Würde mich sehr interessieren.
Wenn ich eine Applikation entwickle die Admin-Rechte für bestimmte Dinge benötigt, dann statte ich diese mit eben solchen aus, der User muss es logischerweise akzeptieren falls UAC aktiviert ist.
Vielleicht hast Du so etwas schonmal in freier Wildbahn gesehen, eine Applikation die so ein schönes Schild-Symbol auf irgend einem Knopf oder Menu, wenn man nun menu oder Knopf drückt verlangt man damit höhere Rechte ein, die vielleicht dafür nötig sind was auch immer Du vorhast zu erledigen auch erledigen zu dürfen.
Falls da irgendwas abwertendes oder sonstwie verhöhnendes drinnen stehen sollte, sorry, so schreibe ich, also fühle Dich nicht angegriffen, ich meine das bestimmt nicht so.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz