|
[ Nemanja Avramović @ 20.11.2006. 12:51 ] @
| 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  |
[ Srki_82 @ 20.11.2006. 13:02 ] @
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.
[ Nemanja Avramović @ 20.11.2006. 13:09 ] @
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.
[ Nemanja Avramović @ 20.11.2006. 13:38 ] @
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
[Ovu poruku je menjao Nemanja Avramović dana 20.11.2006. u 15:05 GMT+1]
[ Srki_82 @ 20.11.2006. 14:11 ] @
Proveri samo da li dobro radi sa putanjama koje imaju razmak. Cini mi se da TStringList razdvaja string i po Delimiter i po razmaku.
[ Nemanja Avramović @ 20.11.2006. 14:21 ] @
Hmmm... u pravu si... ne radi kako treba, tj. razdvaja i po razmaku. Imaš li neku ideju kako rešiti? 
[ reiser @ 20.11.2006. 14:32 ] @
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;
[ Nemanja Avramović @ 20.11.2006. 14:47 ] @
Č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 
[ reiser @ 20.11.2006. 15:00 ] @
rasto opet si high, obe funkcije su potpuno iste :)
np
[Ovu poruku je menjao reiser dana 20.11.2006. u 18:18 GMT+1]
[ Nemanja Avramović @ 20.11.2006. 15:42 ] @
Citat: reiser: rasto opet si high...
Možda, a možda sam zaboravio da iskopiram poslednja dva reda  (a možda si i ti radi brzu izmenu odmah pošto si postovao, a? A? A!?  )
[ Srki_82 @ 20.11.2006. 17:03 ] @
E, tako... sad kad ste lepo ispisali sve, mogu da vam kazem kako se zove funkcija u FPC koja to radi FExpand i nalazi se u unit-u dos (ne brini, nije vezana samo za DOS operativni sistem... radi i na Win, Lin, MacOS...).
[ reiser @ 20.11.2006. 17:19 ] @
*clap*
[ Nemanja Avramović @ 20.11.2006. 17:47 ] @
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?
[ Srki_82 @ 20.11.2006. 20:05 ] @
Hajde, hajde  Svako ima svoje tajne.. procitas par puta source code lazarusa i otprilike znas gde se sta nalazi
Kako bi ti napisao tu funkciju (MinimizeName)? 
[ Nemanja Avramović @ 20.11.2006. 20:57 ] @
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?!  No way... 
[ Srki_82 @ 21.11.2006. 09:06 ] @
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;
[ Nemanja Avramović @ 21.11.2006. 10:47 ] @
Hm... hvala, pogledaću to malo detaljnije kasnije 
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|