AGB  ·  Datenschutz  ·  Impressum  







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

Gibts Alternativen zu File-/DirectoryExists?

Ein Thema von Jumpy · begonnen am 10. Mai 2011 · letzter Beitrag vom 25. Jul 2013
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 11. Mai 2011, 14:04
Das ist meist einfach eine Zahl.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#12

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 11. Mai 2011, 15:49
Mein Feierabendstand für heute .
Will jetzt noch auf Laufwerk testen. Gibts was um das Laufwerk aus einem Pfad zu ziehen? Kann ich notfalls auch selber bauen, indem ich nach dem Doppelpunkt suche, denk ich mal.
Vorausgesetzt es ist kein UNC Pfad. Was mach ich aber dann? Woher weiß ich wo bei einem UNC Pfad das "Laufwerk" aufhört und die Verzeichnisse anfangen?

"\\server_abc\farm_2\Reports\Kundenname\2010_1 2"
ist gleich / kann gleich sein
"R:\Kundenname\2010_12"

Delphi-Quellcode:
unit uCheck;

interface

uses StrUtils, SysUtils;

type
  TFileDirExistsRet = set of (fdeFile, fdeDir, fdeShortDir, fdeLW);

function FileDirExists( const FileOrDir : string ) : TFileDirExistsRet;
function HasExtension(const Filename : string) : Boolean;

implementation

function HasExtension(const Filename : string) : Boolean;
begin
  if Pos('.',Filename)>0 then Result:=true
  else Result := false;
end;

function IsUNCPath(const Filename : string) : Boolean;
begin
  if Copy(Filename,1,2)='\\then Result:=true
  else Result := false;
end;

function FileDirExists( const FileOrDir : string ) : TFileDirExistsRet;
var Path : String;
begin
  Result:=[];
  Path:=ExtractFilePath(FileOrDir);

  if FileExists(FileOrDir) then
    Result:=[fdeFile, fdeDir, fdeShortDir, fdeLW]
  else
    begin
    if HasExtension(FileOrDir) then
      begin
      if DirectoryExists(Path) then
        Result:=[fdeDir, fdeShortDir, fdeLW]
      else
        begin
        if DirectoryExists(ExtractFilepath(Path)) then
          Result:=[fdeShortDir, fdeLW]
        else
          begin
            //Laufwerk prüfen, was wenn UNC?
          end;
        end
      end
    else
      begin
      if DirectoryExists(FileOrDir) then
        Result:=[fdeDir, fdeShortDir, fdeLW]
      else
        begin
        if DirectoryExists(Path) then
          Result:=[fdeShortDir, fdeLW]
        else
          begin
            //Laufwerk prüfen, was wenn UNC?
          end;
        end
      end
    end;
end;

end.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 11. Mai 2011, 15:55
Ein UNC-Pfad besitzt nun einmal kein Laufwerk, da kannst Du auch nichts prüfen. Du könntest höchstens nachsehen, ob auf Deinem Rechner ein Laufwerk gegen eine Freigabe des Rechners, auf den der UNC-Pfad zeigt, gemappt ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#14

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 11. Mai 2011, 20:59
Hab ich fast befürchtet. UNC-Pfade geben wir meist an, wenn unsicher ist, ob für den User das Laufwerk überhaupt gemappt ist, z.B. bei Jobs die Batchmäßig auf Servern laufen. Allerdings kam mit gerade die Idee, das ich ja eine Liste ablegen könnte mit allen UNC-"Laufwerken". Danke.
Ralph
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#15

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 12. Mai 2011, 08:33
Guten morgen zusammen,

hier die vorerst fertige Version (wenn keinem mehr was dran auffällt) was ich ändern sollte.
Hab mir alle Funktionen rund um Pfade und Files in der Hilfe angeschaut. Dies hat zu einem Umbau
der HasExtension-Funktion geführt und der Erkenntnis, dass ich mir das Laufwerk mit ExtractFileDrive aus dem Pfad holen kann, wobei auch im Falles eines UNC-Pfades was brauchbares rauskommt.

Delphi-Quellcode:
unit uCheck;

interface

uses StrUtils, SysUtils;

type
  TFileDirExistsRet = set of (fdeFile, fdeDir, fdeShortDir, fdeLW, fdeUNC);

function FileDirExists( const FileOrDir : string ) : TFileDirExistsRet;
function HasExtension(const Filename : string) : Boolean;

implementation

function HasExtension(const Filename : string) : Boolean;
begin
  if ExtractFileExt(Filename)<>'then Result:=true
  else Result := false;
end;

function IsUNCPath(const Filename : string) : Boolean;
begin
  if Copy(Filename,1,2)='\\then Result:=true
  else Result := false;
end;

function FileDirExists( const FileOrDir : string ) : TFileDirExistsRet;
var
  Path : String;
begin
  Result:=[];
  Path:=ExtractFilePath(FileOrDir);
  if FileExists(FileOrDir) then
    Result:=[fdeFile, fdeDir, fdeShortDir, fdeLW]
  else
    begin
    if HasExtension(FileOrDir) then
      begin
      if DirectoryExists(Path) then
        Result:=[fdeDir, fdeShortDir, fdeLW]
      else
        begin
        if DirectoryExists(ExtractFilepath(Path)) then
          Result:=[fdeShortDir, fdeLW]
        else
          begin
            if DirectoryExists(ExtractFileDrive(FileOrDir)) then
              Result:=[fdeLW]
          end;
        end
      end
    else
      begin
      if DirectoryExists(FileOrDir) then
        Result:=[fdeDir, fdeShortDir, fdeLW]
      else
        begin
        if DirectoryExists(Path) then
          Result:=[fdeShortDir, fdeLW]
        else
          begin
            if DirectoryExists(ExtractFileDrive(FileOrDir)) then
              Result:=[fdeLW]
          end;
        end
      end
    end;

  //Festetllen ob UNC-Pfad
  if IsUNCPath(FileOrDir) then
    Result:=Result+[fdeUNC]
end;

end.
Ralph
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#16

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 12. Mai 2011, 09:29
Mach mal einen Doppelpost statt eines Edits, weil ich im obigen Zusammenhang noch eine andere Frage habe. Ich habe in Excel eine ähnliche Checker-Klasse gebaut. Darin gab es eine Funktion, die den Status des Laufwerkes (eines Pfades) geprüft hat:

Code:
'VBA-Code
Private Function Laufwerkstatus(ByVal Pfad As String) As Integer
  On Error Resume Next
  If CreateObject("Scripting.FileSystemObject").GetDrive(Pfad).IsReady = True Then
    If Err.Number = 68 Then
      Laufwerkstatus = 0    'Das Laufwerk ist nicht verfügbar.
      Err.Clear
      Exit Function
    Else
      Laufwerkstatus = 1    'Das Laufwerk ist verfügbar und bereit.
      Exit Function
    End If
  Else
    Laufwerkstatus = 2      'Das Laufwerk ist verfügbar aber nicht bereit.
  End If
End Function
Es gab nämlich manchmal das Problem, dass das (Netz-)Laufwerk scheinbar da war, wurde z.B. auch im Explorer angezeigt, aber der Zugriff darauf scheiterte dann. Mal wegen Problemen mit dem Netzwerk oder dem DFS.

Frage nun, kann man das auch in Delphi nachbauen? CreateObject gibts doch in Delphi auch, oder?
Ralph
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#17

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 13. Mai 2011, 09:39
Habs nach einigem googeln und rumprobieren geschafft, es nach Delphi zu portieren, hoffe ich zumindest. Es ist keine Eins-zu-Eins Umsetzung, denn ich wußte nicht, wie man in Delphi sowas wie "OnErrorResumNext und dann gib mit den Fehlercode" macht und habe das mMn entsprechend in try...except gepackt. Da ich auch nicht wußte, was die ErrCode 68 Entsprechung in Delphi ist, hab ich das auch weggelassen.
Es funktioniert aber so wie ich dachte das es soll.

Delphi-Quellcode:
procedure TMain.Test(Pfad : String);
var
  b : Boolean;
  fso : OleVariant;
begin
  try
    // b := CreateOleObject('Scripting.FileSystemObject').GetDrive(fso.GetDriveName(Pfad)).IsReady;
    // obige Zeile kompiliert nicht, umweg über fso-Variable muss scheinbar sein
    fso := CreateOleObject('Scripting.FileSystemObject');
    b := fso.GetDrive(fso.GetDriveName(Pfad)).IsReady;
    if b then showmessage('Verfügbar und bereit')
    else showmessage('Verfügbar aber nicht bereit')
  except // on e : Exception do
    showmessage('Nicht verfügbar');
  end;
end;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 13. Mai 2011, 09:51
// obige Zeile kompiliert nicht, umweg über fso-Variable muss scheinbar sein
Welches CreateOleObject nutzt du denn?
Das aus Unit OleAuto oder aus Unit ComObj?

Versuch mal Ersteres. Ansonsten könnte man noch versuchen es umzucasten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (13. Mai 2011 um 09:55 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#19

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 13. Mai 2011, 10:41
Welches CreateOleObject nutzt du denn?
Das aus Unit OleAuto oder aus Unit ComObj?

Versuch mal Ersteres. Ansonsten könnte man noch versuchen es umzucasten.
Habe ComObj benutzt. Nach deinem Tipp auch mal OleAuto ausprobiert.
(Mein Workarround funktioniert auch mit OleAuto, aber das war ja zu erwarten)

Dann die Einzeilige Variante ohne den Umweg über die fso-Variable probiert mit dem Ergebnis, dass
es schonmal ohne meckern kompiliert wird. Aber es kommt die Fehlermeldung:
Exception der Klasse EVariantInvalidOpError mit der Meldung 'Ungültige Variantenoperation' aufgetreten.
Ralph
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#20

AW: Gibts Alternativen zu File-/DirectoryExists?

  Alt 25. Jul 2013, 07:58
Zumindest die kurze Variante geht noch kürzer (Ok, hab' geschaut woher die SysUtils Funktionen die Infos holen):
Delphi-Quellcode:
function FileDirExists(s: String): Boolean;
begin
  Result := GetFileAttributes(PChar(s)) <> $FFFFFFFF;
end;
Result kann man natürlich noch auswerten für eine differenzierte Rückgabe, aber dann ist es auch nicht mehr kürzer.
Ist NICHT das Gleiche wie in #5.

Funktioniert in WIN 8 nicht, aber kurzer Code in #5 geht.
  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 17:41 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