AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dateipfad extrahieren

Ein Thema von implementation · begonnen am 10. Mär 2009 · letzter Beitrag vom 11. Mär 2009
Antwort Antwort
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#1

Dateipfad extrahieren

  Alt 10. Mär 2009, 17:40
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='filethen begin
    FProtocol := fpWinFile;
    Read(f,c);
    Read(f,c);
    goto letter;
  end else if s='httpthen begin
    FProtocol := fpHTTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='ftpthen begin
    FProtocol := fpFTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='httpsthen begin
    FProtocol := fpHTTPS;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='ftpsthen begin
    FProtocol := fpFTPS;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='sftpthen begin
    FProtocol := fpSFTP;
    FWebRef := WindowsFilePath;
    goto exit;
  end else if s='tftpthen 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:
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
   Notify(NOT_NOTICE,[],TDir(FDir.Descendant).Name); schreibe, bekomme ich eine AccessViolation.

1. Frage: Warum?
2. Verbesserungsvorschläge wären hilfreich
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Dateipfad extrahieren

  Alt 10. Mär 2009, 18:26
Hallo Implementation

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

Gruß
K-H
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Dateipfad extrahieren

  Alt 10. Mär 2009, 18:35
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.
Marvin
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Dateipfad extrahieren

  Alt 10. Mär 2009, 18:49
mehrfach diese Function aufrufen

oder ExplodeExplode mit '\'
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Dateipfad extrahieren

  Alt 11. Mär 2009, 16:05
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
Marvin
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Dateipfad extrahieren

  Alt 11. Mär 2009, 16:08
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Dateipfad extrahieren

  Alt 11. Mär 2009, 16:10
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:27 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