![]() |
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:
Der Aufruf:
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;
Delphi-Quellcode:
Der Konstruktor ist noch nicht fertig, ich mache bis jetzt nur Versuche, um festzustellen, ob er funktioniert.
TestFile := TFile.CreateByWin('C:\xyz.xyz\x');
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:
schreibe, bekomme ich eine AccessViolation.
Notify(NOT_NOTICE,[],TDir(FDir.Descendant).Name);
1. Frage: Warum? 2. Verbesserungsvorschläge wären hilfreich |
Re: Dateipfad extrahieren
Hallo Implementation
welche Fehlermeldung bekommst Du denn? Und da gibt es eine Funktion, die nennt sich ExtractFileDir! Gruß K-H |
Re: Dateipfad extrahieren
Zitat:
|
Re: Dateipfad extrahieren
|
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 |
Re: Dateipfad extrahieren
Zitat:
bei Leerzeichen? Wenn Dein Dateiname/Verzeichnisname ein Leerzeichen enthält wird er zerpflückt - oder nicht? Grüße Klaus |
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 10:23 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