![]() |
AW: Gibts Alternativen zu File-/DirectoryExists?
Das ist meist einfach eine Zahl.
|
AW: Gibts Alternativen zu File-/DirectoryExists?
Mein Feierabendstand für heute :-D.
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. |
AW: Gibts Alternativen zu File-/DirectoryExists?
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.
|
AW: Gibts Alternativen zu File-/DirectoryExists?
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.
|
AW: Gibts Alternativen zu File-/DirectoryExists?
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. |
AW: Gibts Alternativen zu File-/DirectoryExists?
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:
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.
'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 Frage nun, kann man das auch in Delphi nachbauen? CreateObject gibts doch in Delphi auch, oder? |
AW: Gibts Alternativen zu File-/DirectoryExists?
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; |
AW: Gibts Alternativen zu File-/DirectoryExists?
Zitat:
Das aus Unit OleAuto oder aus Unit ComObj? Versuch mal Ersteres. Ansonsten könnte man noch versuchen es umzucasten. |
AW: Gibts Alternativen zu File-/DirectoryExists?
Zitat:
(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. |
AW: Gibts Alternativen zu File-/DirectoryExists?
Zitat:
Funktioniert in WIN 8 nicht, aber kurzer Code in #5 geht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:17 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