Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako?

  • 16 odgovora
  • 6.290 pregleda

Najnovija ↓

Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 13:51 · pre 242 meseca #1
Pozdrav,
trebalo bi mi čisto pascal rešenje jer radim u Lazarusu (FreePascalu) u vidu funkcije koja će mi, recimo, od stringa: /home/avram/../pera/ napraviti pravu putanju a to je /home/pera/ (dvotačka poništava prethodni dir). Pa ako neko zna kako bi ovo moglo da se odradi lako, nek' se izjasni sada ili nek' ćuti zauvek :)
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 14:02 · pre 242 meseca #2
Rastavi string na mestima gde se nalazi / u, recimo, TStringList ili kako vec hoces, zatim kreni od nazad i proveravaj svaki string u listi. Ako je string .. tada brises taj i sledeci (ides u nazad i zado sledeci nije I + 1 nego I - 1). Na kraju ces u listi imati stringove koje kada spojis daju putanju bez ..
Mozda bi mogao da protrcis kroz funkcije za rad sa imenima foldera i datoteka... mozda vec ima nesto gotovo.
Potpis
Play Store
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 14:09 · pre 242 meseca #3
Znao sam i ja tako da odradim (bar teoretski ;)) ali mi se činilo da je prilično sporo. A Lazarus nema neku dokumentaciju (bar ja nisam našao nikakvu) gde bih mogao da pogledam to... ok... pogledaću još malo.
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 14:38 · pre 242 meseca
izmenjeno 1 put, poslednji put Nemanja Avramović 20.11.2006. u 15:05
  1. Nemanja Avramović20.11.2006. u 15:05zapis iz teksta poruke
#4
Evo ga, ne znam koliko je brzo, ali vrsi posao:

Code:
//explode string
function explode(delimiter:char;text:string):TStringList;
begin
Result := TStringList.Create;
Result.Delimiter:=delimiter;
Result.DelimitedText:=text;
end;

function fixpath(path:string):string;
var lista:TStringList;
    broj, loop:integer;
    novapath:string;
begin
  lista:=TStringList.Create;
  lista:=explode('/',path);
  broj:=lista.Count-1;
  for loop:=broj downto 1 do begin
    if lista[loop] = '..' then begin
      lista[loop]:='';
      lista[loop-1]:='';
    end;
    if lista[loop] = '.' then begin
      lista[loop]:='';
    end;
  end;
  
  novapath := '';
  for loop := 0 to lista.Count -1 do begin
    if trim(lista[loop])<>'' then novapath := novapath + '/' + lista[loop];
  end;
  novapath := novapath + '/';
  lista.free;
  Result:=trim(novapath);
end;


edit: Ponekad mi vrati grešku List index out of bounds (4) a ne znam zašto. Sačekajte malo dok ispravim f-ju...

edit2: Imao sam problema sa brisanjem elemenata (tamo gde je lista[loop-1]) ali ovako radi :)
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 15:32 · pre 242 meseca #7
Zar nije brze:

Code:
function FixUnixPath(APath : String) : String;
var
  C1 : Integer;
  LP : Integer;
  FD : Integer;
begin
  LP := Pos('/..', APath);
  While LP <> 0 Do
  Begin
    FD := 1;
    For C1 := LP - 1 downto 1 Do
      If APath[C1] = '/' Then
      Begin
        FD := C1;
        Break;
      End;

    Delete(APath, FD, LP - FD + 3);
    LP := Pos('/..', APath);
  End;

  result := APath;
end;
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 15:47 · pre 242 meseca #8
Čini mi se da si izostavio jedno end; i result:=APath, ali evo ispravljene verzije:

Code:
function FixUnixPath(APath : String) : String;
var
  C1 : Integer;
  LP : Integer;
  FD : Integer;
begin
  LP := Pos('/..', APath);
  While LP <> 0 Do
  Begin
    FD := 1;
    For C1 := LP - 1 downto 1 Do
      If APath[C1] = '/' Then
      Begin
        FD := C1;
        Break;
      End;

    Delete(APath, FD, LP - FD + 3);
    LP := Pos('/..', APath);
   end;
    result:=APath;
end;


Hvala reiserko :)
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 16:42 · pre 242 meseca #10
Citat:
reiser: rasto opet si high...


Možda, a možda sam zaboravio da iskopiram poslednja dva reda :D (a možda si i ti radi brzu izmenu odmah pošto si postovao, a? A? A!? ;))
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 18:47 · pre 242 meseca #13
Daj srki reci odakle izvlačiš to? :) Daj link za neki (dobar) help.

edit: Kad sam već tu, jel ima f-ja ekvivalentna funkciji MinimizeName u Delphiju, ali u Lazarusu?
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 20.11.2006. u 21:57 · pre 242 meseca #15
Posaljes joj string (putanju) tipa /home/avram/Desktop/downloads/fajl.tar.gz i canvas (npr. canvas od label1) i ono skrati na width canvasa tako da dobiješ /home/avram/.../fajl.tar.gz

Ta funkcija (i minimizename i minimizefilename) postoji u Delphiju.

Da čitam source Lazarusa? Par puta?! :D No way... :p
Potpis
Laravel Srbija.

[NE PRUŽAM PODRŠKU ZA PHP PREKO PRIVATNIH PORUKA!]
Re: Pravilno formiranje UNIX putanje, odstraniti ../ i prethodni dir - kako? 21.11.2006. u 10:06 · pre 242 meseca #16
Hehe... ne mogu da nadjem funkciju koja to radi... pa, nista... moraces da je napises sam. Evo kako to Delphi radi, pa ti samo doteraj kod.
Code:
procedure CutFirstDirectory(var S: TFileName);
var
  Root: Boolean;
  P: Integer;
begin
  if S = '\' then
    S := ''
  else
  begin
    if S[1] = '\' then
    begin
      Root := True;
      Delete(S, 1, 1);
    end
    else
      Root := False;
    if S[1] = '.' then
      Delete(S, 1, 4);
    P := AnsiPos('\',S);
    if P <> 0 then
    begin
      Delete(S, 1, P);
      S := '...\' + S;
    end
    else
      S := '';
    if Root then
      S := '\' + S;
  end;
end;

function MinimizeName(const Filename: TFileName; Canvas: TCanvas;
  MaxLen: Integer): TFileName;
var
  Drive: TFileName;
  Dir: TFileName;
  Name: TFileName;
begin
  Result := FileName;
  Dir := ExtractFilePath(Result);
  Name := ExtractFileName(Result);

  if (Length(Dir) >= 2) and (Dir[2] = ':') then
  begin
    Drive := Copy(Dir, 1, 2);
    Delete(Dir, 1, 2);
  end
  else
    Drive := '';
  while ((Dir <> '') or (Drive <> '')) and (Canvas.TextWidth(Result) > MaxLen) do
  begin
    if Dir = '\...\' then
    begin
      Drive := '';
      Dir := '...\';
    end
    else if Dir = '' then
      Drive := ''
    else
      CutFirstDirectory(Dir);
    Result := Drive + Dir + Name;
  end;
end;
Potpis
Play Store
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme