Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Delphi Datei im Pfad finden (https://www.delphipraxis.net/72865-datei-im-pfad-finden.html)

Union 8. Jul 2006 10:06


Datei im Pfad finden
 
Mit dieser Konsolenanwendung kann man sich auflisten lassen, in welchen Pfaden eine Datei liegt. Beispiel für den Aufruf:
Zitat:

Zitat von pathof
pathof dcc32.exe
C:\Programme\Borland\BDS\4.0\Bin\dcc32.exe
C:\Programme\Borland\Delphi7\Bin\dcc32.exe

Das kann wichtig sein, wenn man mehrere Installationen besitzt und diese z.b. aus einer Batchdatei heraus aufrufen möchte.

[edit]Man kann jetzt auch einen Dateinamen ohne Extension übergeben - in diesem Fall wird die in PATHEXT hinterlegte Liste von Extensions für jeden Pfad-Eintrag abgearbeitet.[/edit]

Hier der Code:
Delphi-Quellcode:
program Pathof;

{$APPTYPE CONSOLE}
{$WARNINGS OFF}
uses
  SysUtils,
  Windows;

type
   TStringArray = Array of string;

procedure SplitStringByDelimiter(Value : string; Delimiter : char; var AStrings : TStringArray);
var
   P, P1 : PChar;
   S : string;
begin
   P := PChar(Value);
   while P^ <> #0 do
   begin
      P1 := P;
      while (P^ <> Delimiter) and (P^ <> #0) do
         P := CharNext(P);

      SetString(S, P1, P-P1);
      Setlength(AStrings, length(AStrings)+1);
      AStrings[high(AStrings)] := S;
      P := CharNext(P);
   end;
end;

var
   Found : boolean;
   iPath, iExt : integer;
   FilePath, FileName, FileExt : string;
   PathList, PathExts : TStringArray;
begin
   if (ParamCount = 0) then
      WriteLn('Usage : Pathof <filename[.extension]>')
   else
   begin
      FileName := ExtractFileName(ParamStr(1));
      FileExt  := ExtractFileExt(FileName);

      if FileExt = '' then
         FileExt := GetEnvironmentVariable('pathext');

      SplitStringByDelimiter(FileExt, ';', PathExts);
      SplitStringByDelimiter(GetEnvironmentVariable('path'), ';', PathList);

      for iPath := 0 to High(PathList) do
      begin
         PathList[iPath] := IncludeTrailingPathDelimiter(PathList[iPath]);
         for iExt := 0 to High(PathExts) do
         begin
            FilePath := PathList[iPath]+ChangeFileExt(Filename,PathExts[iExt]);
            if fileexists(FilePath) then
            begin
               Found := true;
               WriteLn(FilePath);
            end;
         end;
      end;

      if not Found then
         Writeln(Filename+' not found in path'#7);
   end;
end.

marabu 8. Jul 2006 11:04

Re: Datei im Pfad finden
 
Hallo Union,

ich glaube mich dunkel zu erinnern, dass es unter Unix einen Befehl gab (fake?), der diese Funktionalität hatte. Unter DOS und Windows habe ich mir zuletzt (command shell extensions) so beholfen:

Code:
@echo off
rem LOCATE.CMD
if '%1==' goto usage
for /D %%f in (.;%path%) do for %%e in (%PATHEXT%) do if exist "%%f\%1%%e" echo "%%f\%1%%e"
goto exit
:usage
echo LOCATE sucht einen Befehl in den (ohne Erweiterung) von PATH bestimmten Ordnern
echo Aufruf: locate befehl
echo Beispiel: locate cmd
:exit
Ziel war immer zu ermitteln, was die command shell ausführen würde, wenn man nur den Befehl eingeben würde. Wäre die Berücksichtigung von PATHEXT nicht auch für dein Programm eine Überlegung wert?

Freundliche Grüße vom marabu

Union 8. Jul 2006 11:12

Re: Datei im Pfad finden
 
Hallo marabu,

natürlich gab es das unter Unix. Ich wollte es halt selber programmieren. Mit PATHEXT hatte ich auch zunächst überlegt, es dann aber verworfen, da dadurch Flexibilität verloren ginge. PATHEXT hätte den Vorteil, dass man die Extension nicht zu wissen braucht. Nachteilig wäre, dass man dann aber keine cfg, ini usw. mehr suchen lassen kann. Natürlich müsste man um das Verhalten von Windows zu simulieren auch die Reihenfolge verändern (Zuerst aktuelles Verzeichnis, dann Windows, dann System32 und dann der Rest).

marabu 8. Jul 2006 11:47

Re: Datei im Pfad finden
 
Zitat:

Zitat von Union
Mit PATHEXT hatte ich auch zunächst überlegt, es dann aber verworfen, da dadurch Flexibilität verloren ginge.

Was hältst du von einem Best-Of-Both-Worlds Ansatz? Mache die Berücksichtigung von PATHEXT vom übergebenen Argument abhängig - fehlt die Erweiterung, dann kommt PATHEXT ins Spiel. Vor der Einführung von PATHEXT gab es übrigens eine definierte Suchfolge (COM, EXE, BAT).

Zitat:

Zitat von Union
Natürlich müsste man um das Verhalten von Windows zu simulieren auch die Reihenfolge verändern (Zuerst aktuelles Verzeichnis, dann Windows, dann System32 und dann der Rest).

Ich denke, nur das current working directory muss zuerst durchsucht werden, die anderen beiden werden doch von Windows automatisch in der Systemvariablen PATH eingetragen.

marabu

SirThornberry 8. Jul 2006 11:50

Re: Datei im Pfad finden
 
wenn man nicht nur in den "path"-Verzeichnissen suchen will geht in der Console auch folgendes:
dir /S filename

vorher natürlich in das entsprechende Root-Verzeichnis wechseln bsp:
c:
cd \
dir /s command.com

Union 10. Jul 2006 19:56

Re: Datei im Pfad finden
 
Mach mal Dir /S auf einer vollen 200 GB Platte...

DP-Maintenance 3. Aug 2006 12:48

DP-Maintenance
 
Dieses Thema wurde von "Chakotay1308" von "Neuen Beitrag zur Code-Library hinzufügen" nach "Open-Source" verschoben.


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