AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Datei-/Verzeichnisname als DatenTyp
Thema durchsuchen
Ansicht
Themen-Optionen

Datei-/Verzeichnisname als DatenTyp

Ein Thema von Sir Rufo · begonnen am 7. Feb 2011 · letzter Beitrag vom 17. Feb 2020
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo
Registriert seit: 5. Jan 2005
Da ich von Haus aus ein sehr fauler Mensch bin regt mich das immer wiederkehrende Rumgefuddel mit dem Handling von Datei- und Verzeichnisnamen immer wieder auf.

Also war ich etwas fleißig um wieder faul sein zu können und habe einen Datentypen für Datei- und Verzeichnisnamen erstellt.

Umgesetzt wurde dieses mittels eines Records und überladenen Operatoren, damit die Verwendung so einfach von der Hand geht wie mit einem String. Der Vorteil hierbei ist aber, dass dieser Datentyp die Environment-Variablen von Windows berücksichtigt und auflöst.

Somit ist also folgendes möglich:
Delphi-Quellcode:
MyFileName := '%UserProfile%\Meine Datei.txt';
ShowMessage( MyFileName ); // Zeigt "C:\Users\Sepp\Meine Datei.txt" an
Und da es so schön war, habe ich noch diverse andere schicke Sachen eingebaut.
Einen Großteil kann man sich mit der beigefügten Exe-Datei (FileNameDataType.zip) ansehen und direkt ausprobieren.
Code:
{ +==========================================================================
  | TFileName = record
  +==========================================================================
  | Ein Record zur Vereinfachung des Dateinamen-Handlings
  |
  | Akzeptiert als Dateinamen auch die Environment-Variablen und übersetzt
  | diese automatisch.
  |
  | FileName := '%SYSTEMDRIVE%\%USERNAME%\Meine Datei.txt';
  |
  | Eigene Environment-Variablen können gesetzt werden. Diese dürfen auch
  | Environment-Variablen des Systems beinhalten.
  | (Default wird die Variable $(app) mit dem Pfad der Anwendung belegt)
  |
  | FileName := '$(app)\Meine Datei.txt'
  |
  | Implizite Umwandlungen:
  | -----------------------
  | FileName (String)     => 'C:\Sepp\Meine Datei.txt' (Dateiname)
  |
  | Eigenschaften (read/write):
  | ---------------------------
  | FileName.Raw          => '%SYSTEMDRIVE%\%USERNAME%\Meine Datei.txt'
  | FileName.Path         => 'C:\Sepp\'
  | FileName.FileName     => 'Meine Datei.txt'
  | FileName.Extension    => '.txt'
  |
  | Funktionen:
  | -----------
  | FullName (String)          => Kompletter gewandelter Dateiname
  | Exists (Boolean)           => Existiert die Datei
  | Creation (TDateTime)       => Zeitpunkt der Erstellung
  | LastAccess (TDateTime)     => Zeitpunkt des letzten Zugriffs
  | LastWrite (TDateTime)      => Zeitpunkt der letzten Änderung
  | Attributes (Cardinal)      => Attribute
  | Size (Int64)               => Größe
  | PathExists (Boolean)       => Existiert der Pfad
  | ForcePath (Boolean)        => Legt den Pfad an
  |                                (ForceDirectories)
  | Delete (Boolean)           => Löscht die Datei auf dem Datenträger
  |                                (DeleteFile)
  | Rename( string ) (Boolean) => Benennt die Datei auf dem Datenträger um
  |                                (RenameFile)
  |
  | Methoden:
  | =========
  | cd( string )               => Wechselt das Verzeichnis (relativ)
  | Burn                       => Wandelt einen relativen Pfad in Raw in
  |                                einen absoluten Pfad um
  | EnhanceEnvironmentLocal    => Erweitert die lokale Variablenliste
  |                                diese hat Vorrang vor der globalen
  |
  | Klassen-Methoden:
  | =================
  | EnhanceEnvironment         => Erweitert die globale Variablenliste
  +========================================================================== }
Code:
{ +==========================================================================
  | Beispiele
  +==========================================================================
  | 1. Environment-Variablen
  | ------------------------
  |
  | a)
  | FileName := '%systemroot%\Test.txt';
  | // FileName => 'C:\Windows\Test.txt'
  |
  | b)
  | FileName := '%systemdrive%\%username%\Test.txt';
  | // FileName => 'C:\Sepp\Test.txt'
  |
  | 2. Eigene Environment-Variablen
  | -------------------------------
  |
  | a) global
  | TFileName.EnhanceEnvironment( 'Daten', 'C:\Meine Daten\%username%' );
  | FileNameA := '$(Daten)\Test.txt';
  | FileNameB := '$(Daten)\Test.txt';
  | // FileNameA => 'C:\Meine Daten\Sepp\Test.txt'
  | // FileNameB => 'C:\Meine Daten\Sepp\Test.txt'
  | TFileName.EnhanceEnvironment( 'Daten', 'C:\Meine Daten\%computername%' );
  | // FileNameA => 'C:\Meine Daten\SeppSeinPC\Test.txt'
  | // FileNameB => 'C:\Meine Daten\SeppSeinPC\Test.txt'
  |
  | b) lokal
  | FileNameA := '$(Daten)\Test.txt';
  | FileNameB := '$(Daten)\Test.txt';
  | // FileNameA => 'C:\Meine Daten\Sepp\Test.txt'
  | // FileNameB => 'C:\Meine Daten\Sepp\Test.txt'
  | FileNameA.EnhanceEnvironmentLocal( 'Daten', 'C:\Meine Daten\Temp\' );
  | // FileNameA => 'C:\Meine Daten\Temp\Test.txt'
  | // FileNameB => 'C:\Meine Daten\Sepp\Test.txt'
  | FileNameA.EnhanceEnvironmentLocal( 'Daten', '' );
  | // FileNameA => 'C:\Meine Daten\Sepp\Test.txt'
  | // FileNameB => 'C:\Meine Daten\Sepp\Test.txt'
  |
  | 3. Relative Pfade (aktueller Pfad ist C:\Test\)
  | -----------------------------------------------
  |
  | a)
  |
  | FileName := '..\Test.txt';
  | // FileName    => 'C:\Test.txt'
  | // FileName.Raw => '..\Test.txt'
  | FileName.Burn;
  | // FileName    => 'C:\Test.txt'
  | // FileName.Raw => 'C:\Test.txt'
  |
  | b) mit Environment-Variable
  |
  | FileName := '..\%username%\data\..\Test.txt';
  | // FileName    => 'C:\Sepp\Test.txt'
  | // FileName.Raw => '..\%username%\data\..\Test.txt'
  | FileName.Burn;
  | // FileName    => 'C:\Sepp\Test.txt'
  | // FileName.Raw => 'C:\%username%\Test.txt'
  |
  | c) aber..
  |
  | FileName := '..\%username%\..\Test.txt';
  | // FileName    => 'C:\Test.txt'
  | // FileName.Raw => '..\%username%\..\Test.txt'
  | FileName.Burn;
  | // FileName    => 'C:\Test.txt'
  | // FileName.Raw => 'C:\Test.txt'
  |
  | d) cd
  |
  | FileName := 'C:\%username%\Test.txt';
  | FileName.cd( '..' );
  | // FileName => 'C:\Test.txt'
  | // FileName.Raw => 'C:\%username%\..\Test.txt'
  |
  | 4. Eigenschaften
  | ----------------
  |
  | FileName := 'C:\%username%\Test.txt';
  | FileName.Path := '%systemroot%';
  | // FileName.Raw => '%systemroot%\Test.txt'
  | FileName.FileName := 'Meine Datei.txt';
  | // FileName.Raw => '%systemroot%\Meine Datei.txt'
  | FileName.Extension := '.ini';
  | // FileName.Raw => '%systemroot%\Meine Datei.ini'
  |
  | 5. Benutzung mit Format
  | -----------------------
  | Trotz der impliziten Umwandlung in einen String akzeptiert die Format-
  | Funktion diesen Record nicht als Parameter. Darum so:
  |
  | s := Format( 'Pfad und Dateiname: %s', [ FileName.FullName ] );
  | s := Format( 'nur der Dateiname: %s', [ FileName.FileName ] );
  |
  +========================================================================== }
Ich bitte auch um sinnvolle Vorschläge (fertige Codeteile sind auch immer willkommen) zum Erweitern der Unit.

Sollte ab Delphi 2006 lauffähig sein, da ab der Version die überladenen Operatoren möglich waren.

Sodele, es gibt ein kleines Update.

Code:
Historie:

  | v1.2 - 11.02.2011
  | - Bei der Verwendung in einem Thread kam es teilweise zu einem Fehler
  |   bei der Verwendung der Magics. Ursache war die fehlende Initialisierung
  |   des Magigcs-Record. Bei jeder Änderung des Namens wird nun der Magics-
  |   Record initialisiert
  +--------------------------------------------------------------------------
  | v1.1 - 09.02.2011
  | * Unterstützung auch für nicht UNICODE-Compiler
  | * _FileName: func SizeStr
  | * _FileName: prop FileNameWoExt
  | * _FileName: prop DirName
  | * _DirName: func HasAccessRights
  | * _DirName: func IsCurrentDir
  | * _DirName: func MakeCurrentDir
  | * _DirName: func CurrentDir
  | * _DirName: Files Enumerator für Dateien
  | * _DirName: Dirs Enumerator für Verzeichnisse
  | * interne dynamische Variablen
  |   $(Year), $(Month), $(Day), $(Hour), $(Minute), $(Second), $(MSecond),
  |   $(DayOfWeek) [=Son-Sam], $(DayOfWeekLong) [=Sonntag-Samstag],
  |   $(ProcessID), $(ThreadID), $(MainThreadID),
  |   $(GUID), $(IDX)
  | * Zum Festhalten der dynamischen Variablen (Zeit,GUID) gibt es
  |   die Eigenschaft Magics.Lock
  | * Zum Aktualisieren der gelockten dynamischen Variablen gibt es
  |   die Methode Magic.Refresh
  | * prop Magics.Idx
  | * prop Magics.IdxLength (Default=3)
  | * meth Magics.IncIdx( Step )
  | * meth Magics.DecIdx( Step )
  | + EnhanceEnvironment ist jetzt eine ausgelagerte procedure
  | + Die Ersetzung der Environment-Variablen in eine eigene proc ausgelagert
  | - _FileName: Bei der Zuweisung von Path wurde der Raw-Eintrag von
  |   FileName und Extension verändert
  | - _DirName: Teilweise wurde ein Pfad und kein Verzeichnisname zurück-
  |   geliefert
  | ! Burn schreibt jetzt den Datei-/Verzeichnisnamen fest
Angehängte Dateien
Dateityp: pas insFileName.pas (41,4 KB, 32x aufgerufen)
Dateityp: zip FileNameDataType.zip (544,3 KB, 66x aufgerufen)
Dateityp: pas insSpecialFolders.pas (37,5 KB, 27x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (30. Nov 2011 um 09:01 Uhr)
 
mytbo
 
#11
  Alt 17. Feb 2020, 13:32
Hallo!

Vielen Dank für die Units.

In der Version zum Herunterladen sind aber noch Fehler.

Unit insFileName

Es funktioniert nur, wenn USE_SPECIALFOLDERS definiert ist.
In der Funktion class operator _FileName.implicit fehlt ein
{$ELSE}tmp := a.Raw;

Den Funktion _MagicPart.DecIdx und _MagicPart.IncIdx fehlt der
Rückgabewert Result := FIdx.

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 19:20 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