Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateipfad extrahieren (https://www.delphipraxis.net/130560-dateipfad-extrahieren.html)

implementation 10. Mär 2009 16:40


Dateipfad extrahieren
 
Ich habe eine Klasse, die einen Dateipfad (inklusive Datei) darstellen soll.
Dazu muss sie natürlich auch die Daten aus einem Windows-Dateipfad extrahieren können.
Delphi-Quellcode:
type
  TProtocol = string[4];
  TRoot = string[16];
  TDir = class
    Name: PascalString;
    Descendant: TObject;
    constructor Create(Name:PascalString; Descendant:TObject);
  end;
  TXFile = record
    Name: PascalString;
    Ext, Pref: PascalString;
    Content: TMemoriaFile;
  end;
  TFile = class
  private
    FWFID: Word;
  protected
    FProtocol: TProtocol;
    FRoot: TRoot;
    FDir: TDir;
    FXFile: TXFile;
    FWebRef: PascalString;
    function WFIDCreate:Word;virtual;
    procedure WFIDFree;virtual;
  public
    constructor Create;
    constructor CreateByWin(WindowsFilePath:PascalString);
    constructor CreateByUnix(UnixFilePath:PascalString);
    destructor Destroy;
  published
    property WFID: Word read FWFID;
  end;

const
  // Dateien
  fpWinFile = 'WINF';
  fpUnixFile= 'UNIX';
  // WWW
  fpHTTP   = 'HTTP';
  fpHTTPS  = 'HTTS';
  fpFTP    = 'FTP-';
  fpFTPS   = 'FTPS';
  fpSFTP   = 'SFTP';
  fpTFTP   = 'TFTP';

[...]

constructor TFile.CreateByWin(WindowsFilePath:PascalString);
var s:PascalString; f:TextFile; c:char; cdir: TDir;
label letter,exit;
begin
  Create;
  Assign(f,GetTempFile('filepath'));
  ReWrite(f);
  Write(f,WindowsFilePath);
  Close(f);
  Reset(f);
  letter:
  Read(f,c);
  while c<>':' do begin
    s := s+c;
    Read(f,c);
  end;
  if Length(s)=1 then begin
    FProtocol := fpWinFile;
    FRoot := s;
  end else if s='file' then begin
    FProtocol := fpWinFile;
    Read(f,c);
    Read(f,c);
    goto letter;
  end else if s='http' then begin
    FProtocol := fpHTTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='ftp' then begin
    FProtocol := fpFTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='https' then begin
    FProtocol := fpHTTPS;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='ftps' then begin
    FProtocol := fpFTPS;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='sftp' then begin
    FProtocol := fpSFTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='tftp' then begin
    FProtocol := fpTFTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end;
  s := '';
  if not eof(f) then begin
    Read(f,c);
    Read(f,c);
    while (not eof(f)) and (c<>'\') do begin
      s := s+c;
      Read(f,c);
    end;
    if c<>'\' then s := s+c;
    FDir := TDir.Create(s,nil);
    cdir := TDir(FDir.Descendant);
  end;
  while (not eof(f)) do begin
    Read(f,c);
    s := '';
    Read(f,c);
    while (not eof(f)) and (c<>'\') do begin
      s := s+c;
      Read(f,c);
    end;
    s := s+c;
    cdir := TDir.Create(s,nil);
    cdir := TDir(cdir.Descendant);
  end;
  Notify(NOT_NOTICE,[],FDir.Name); // PUNKT A
  exit:
  Close(f);
  Erase(f);
end;
Der Aufruf:
Delphi-Quellcode:
TestFile := TFile.CreateByWin('C:\xyz.xyz\x');
Der Konstruktor ist noch nicht fertig, ich mache bis jetzt nur Versuche, um festzustellen, ob er funktioniert.
So, wie er oben steht, funktioniert er auch noch, und liefert (mit Notify) das gewünschte 'xyz.xyz'.
Nur wenn ich an (PUNKT A) nun
Delphi-Quellcode:
   Notify(NOT_NOTICE,[],TDir(FDir.Descendant).Name);
schreibe, bekomme ich eine AccessViolation.

1. Frage: Warum?
2. Verbesserungsvorschläge wären hilfreich

p80286 10. Mär 2009 17:26

Re: Dateipfad extrahieren
 
Hallo Implementation

welche Fehlermeldung bekommst Du denn?
Und da gibt es eine Funktion, die nennt sich ExtractFileDir!

Gruß
K-H

implementation 10. Mär 2009 17:35

Re: Dateipfad extrahieren
 
Zitat:

Zitat von p80286
Und da gibt es eine Funktion, die nennt sich ExtractFileDir!

Nein, ich möchte auch diesen Dateipfad in die einzelnen Ordner zerlegen.

himitsu 10. Mär 2009 17:49

Re: Dateipfad extrahieren
 
mehrfach diese Function aufrufen

oder ExplodeExplode mit '\'

implementation 11. Mär 2009 15:05

Re: Dateipfad extrahieren
 
Der Link war sehr hilfreich!
Ich benutze jetzt eine StringList
a) zum Speichern (jeder Teil eine Zeile)
b) zum extrahieren der Daten
Dafür benutze ich Delimiter und DelimitedText

Klaus01 11. Mär 2009 15:08

Re: Dateipfad extrahieren
 
Zitat:

Zitat von implementation
Der Link war sehr hilfreich!
Ich benutze jetzt eine StringList
a) zum Speichern (jeder Teil eine Zeile)
b) zum extrahieren der Daten
Dafür benutze ich Delimiter und DelimitedText

.. trennt denn Delimiter und DelimitedText nicht auch
bei Leerzeichen?
Wenn Dein Dateiname/Verzeichnisname ein Leerzeichen enthält wird er zerpflückt - oder nicht?

Grüße
Klaus

Luckie 11. Mär 2009 15:10

Re: Dateipfad extrahieren
 
Zu deinem Code allgemein: Versuch mal, ob du nicht die ganzen gotos los wirst, das ist ein ziemlich schrecklicher Programmierstil. Desweiteren würde ich jeden if-Zweig in eine separate Fuktion auslagern. Das macht das ganze auch noch mal übersichtlicher, da man dann aussagekräftige Bezeicher wählen kann, die deutlich machen, was da passiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 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