Thread View: pl.comp.lang.pascal
12 messages
12 total messages
Started by Terrmit
Wed, 25 Jul 2007 15:10
[Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 15:10
Date: Wed, 25 Jul 2007 15:10
17 lines
1199 bytes
1199 bytes
Witam jest := FindFirst(Path + '*', faAnyFile, SR); dla katalogu i linku symbolicznego do katalogu: SR.Attr = $30 SR.ExcludeAttr = $00 dla pliku i linku symbolicznego do pliku SR.Attr = $20 SR.ExcludeAttr = $20 To jak odróżnić katalog od linku i plik od linku symbolicznego? Może ktoś mógłby pomóc, bo już wymiękam. Za wszelkie wskazówki z góry dziękuję. Pozdrawiam, Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 15:27
Date: Wed, 25 Jul 2007 15:27
12 lines
1190 bytes
1190 bytes
Hmmm, TSearchRec.TMode ? dla katalogu otrzymałem: SR.Mode = $41ED dla linku symbolicznego do katalogu: SR.Mode = $41FD ale już dla pliku i linku symbolicznego do pliku taką samą wartość :( SR.Mode = $81A4 Czy to właśnie Mode powinienem użyć? Katalogi OK, ale co z plikami? Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 25 Jul 2007 16:01
Date: Wed, 25 Jul 2007 16:01
33 lines
1999 bytes
1999 bytes
Terrmit wrote: > jest := FindFirst(Path + '*', faAnyFile, SR); > dla katalogu i linku symbolicznego do katalogu: > SR.Attr = $30 > SR.ExcludeAttr = $00 > dla pliku i linku symbolicznego do pliku > SR.Attr = $20 > SR.ExcludeAttr = $20 > > To jak odróżnić katalog od linku i plik od linku symbolicznego? > > Może ktoś mógłby pomóc, bo już wymiękam. > Za wszelkie wskazówki z góry dziękuję. Przed chwila sprawdzałem na Slacku, i rzeczywiście się to dziwnie zachowuje. Nawet sam faSymLink nie daje takich wyników jak powinien. Ja bym zrzucił wszystko faAnyFile, a następnie te pliki/katalogi potraktował stat() żeby sie dowiedzieć czym dokładnie są ;). W fpc to jest hm, albo fstat() albo fpfstat albo coś takiego, w każdym razie ten call powinien powiedzieć Tobie wszystko o danym entity na dysku. Reference i flagi sa pewnie w reference do libc. http://ptm.linux.pl/man_HTML/man2/stat.2.html i okolice ;). A później zerżnać z libc makro S_ISLNK() i fru ;). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 16:52
Date: Wed, 25 Jul 2007 16:52
29 lines
2248 bytes
2248 bytes
Łukasz 'Maly' Ostrowski napisał(a): > Przed chwila sprawdzałem na Slacku, i rzeczywiście się to dziwnie > zachowuje. Nawet sam faSymLink nie daje takich wyników jak powinien. Dzięki za zainteresowanie tematem. faSymLink sprawia wrażenie, jakby go nie było > > Ja bym zrzucił wszystko faAnyFile, a następnie te pliki/katalogi > potraktował stat() żeby sie dowiedzieć czym dokładnie są ;). Nie wchodzi to za bardzo w grę, bo gdy procedura napotyka link symboliczny do katalogu, to wchodzi mi w ten katalog (rekurencyjnie) i dalej tak się zapętla, że zaczyna mi wyświetlać, że mam kilka milionów plików na dysku i dalej jeszcze je zlicza. Mogą być takie miejsca, że wpada w pętlę nieskończoną. Tak więc trzeba badać taki plik na bieżąco. Z linkami do plików jest mniejszy problem. > > W fpc to jest hm, albo fstat() albo fpfstat albo coś takiego, > w każdym razie ten call powinien powiedzieć Tobie wszystko > o danym entity na dysku. Reference i flagi sa pewnie w > reference do libc. Fstat() w module oldlinux. Przebadam to zaraz. Wygląda zachęcająco. Ale ciekawe jeszcze jak się ta funkcja zachowa w MS Windows. > > http://ptm.linux.pl/man_HTML/man2/stat.2.html i okolice ;). > A później zerżnać z libc makro S_ISLNK() i fru ;). > Dzięki za wskazówki. Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 17:52
Date: Wed, 25 Jul 2007 17:52
20 lines
1723 bytes
1723 bytes
> W fpc to jest hm, albo fstat() albo fpfstat albo coś takiego, > w każdym razie ten call powinien powiedzieć Tobie wszystko > o danym entity na dysku. Reference i flagi sa pewnie w > reference do libc. http://lazarus-ccr.sourceforge.net/docs/rtl/oldlinux/fstat.html Niestety info.nlink = 1 niezależnie, czy jest to plik, czy link symboliczny do pliku. Rozróżnia tylko katalog od linku do katalogu dając wynik $04 dla katalogu $12 dla linku do katalogu Z kolei info.mode daje taki sam wynik jak Mode z TSearchRec. Problem katalogów mogę uznać za rozwiązany, ale pozostają jeszcze pliki. Jeśli zechcę skasować znaleziony plik, a okaże się, że nie jest to rzeczywisty plik, tylko dowiązanie symboliczne, to skasuję to dowiązanie, a plik zostaje. Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 18:49
Date: Wed, 25 Jul 2007 18:49
12 lines
1448 bytes
1448 bytes
> Rozróżnia tylko katalog od linku do katalogu dając wynik > $04 dla katalogu > $12 dla linku do katalogu > Problem katalogów mogę uznać za rozwiązany Niestety sukces ogłosiłem za wcześnie. To nie działa. Są katalogi, dla których nlink przyjmuje różne wartości i nie doszedłem z czym to jest związane. W każdym razie ta metoda też nie daje rezultatu, bo bity w nlink nie mają chyba jakiegoś konkretnego znaczenia. :( i jestem w punkcie wyjścia :(
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Wed, 25 Jul 2007 21:34
Date: Wed, 25 Jul 2007 21:34
41 lines
2021 bytes
2021 bytes
[ciach]
> potraktował stat() żeby sie dowiedzieć czym dokładnie są ;).
>
> W fpc to jest hm, albo fstat() albo fpfstat albo coś takiego,
[ciach]
> http://ptm.linux.pl/man_HTML/man2/stat.2.html i okolice ;).
> A później zerżnać z libc makro S_ISLNK() i fru ;).
Hej, zrobione z Twoją pomocą.
Publikuję, bo może komuś się przyda.
uses oldlinux;
//Sprawdza, czy plik jest poprawny
//(czy nie jest to np. link symboliczny do pliku)
function IsFileRegular(const FName: string): Boolean;
var info: stat;
begin
Result := false;
if LStat(FName, info) then
if S_ISREG(info.mode) then
if not S_ISLNK(info.mode) then
Result := true;
end;
//Sprawdza, czy katalog jest poprawny
//(czy nie jest to np. link symboliczny do katalogu)
function IsDirRegular(const Dir: string): Boolean;
var info: stat;
begin
Result := false;
if LStat(Dir, info) then
if S_ISDIR(info.mode) then
if not S_ISLNK(info.mode) then
Result := true;
end;
A może ktoś zrobiłby te funkcje jeszcze lepiej?
Pozdrawiam,
Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 26 Jul 2007 12:32
Date: Thu, 26 Jul 2007 12:32
37 lines
2005 bytes
2005 bytes
Terrmit wrote: > Hej, zrobione z Twoją pomocą. > Publikuję, bo może komuś się przyda. > > uses oldlinux; > > //Sprawdza, czy plik jest poprawny > //(czy nie jest to np. link symboliczny do pliku) > function IsFileRegular(const FName: string): Boolean; > var info: stat; > begin > Result := false; > if LStat(FName, info) then > if S_ISREG(info.mode) then > if not S_ISLNK(info.mode) then > Result := true; > end; if(LStat(FName, info) and S_ISREG(info.mode) and not S_ISLNK(info.mode)) then Result:=true; To oczywiście tylko pod warunkiem że fpc ewaluuje wszystko od lewej do prawej, lub ewaluuje wszystko od lewej do prawej gdy jest function call zawarty w logicznym wyrażeniu(afaik gcc tak robi) ;). Analogicznie druga funkcja. ;). > A może ktoś zrobiłby te funkcje jeszcze lepiej? Funkcje te są elementarne więc nie ma dużo możliwości "poprawienia" :>. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][Linux] FindFirst i Attr
Author: Tygrys
Date: Thu, 26 Jul 2007 19:17
Date: Thu, 26 Jul 2007 19:17
30 lines
1710 bytes
1710 bytes
Łukasz 'Maly' Ostrowski pisze: > Terrmit wrote: >> Hej, zrobione z Twoją pomocą. >> Publikuję, bo może komuś się przyda. >> >> uses oldlinux; >> >> //Sprawdza, czy plik jest poprawny >> //(czy nie jest to np. link symboliczny do pliku) >> function IsFileRegular(const FName: string): Boolean; >> var info: stat; >> begin >> Result := false; >> if LStat(FName, info) then >> if S_ISREG(info.mode) then >> if not S_ISLNK(info.mode) then >> Result := true; >> end; > > > if(LStat(FName, info) and S_ISREG(info.mode) and not S_ISLNK(info.mode)) > then > Result:=true; Result := LStat(FName, info) and S_ISREG(info.mode) and not S_ISLNK(info.mode); :-) Tygrys
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Thu, 26 Jul 2007 20:21
Date: Thu, 26 Jul 2007 20:21
19 lines
1578 bytes
1578 bytes
Tygrys napisał(a): > Result := LStat(FName, info) and S_ISREG(info.mode) and not > S_ISLNK(info.mode); > > :-) > > Tygrys Heh, dobra, OK :) Mnie ewentualnie chodziło o jakąś inną metodę ;) Ale OK, w sumie to bardzo zależy mi na szybkości działania, a takie skompensowanie nieco przyspiesza, więc może być :) Powinno być chyba minimalnie szybciej, ale badać mi się tego chyba nie chce ;) Tylko takie "kompresowanie" czasami zaciemnia kod, dlatego nie można z tym przeginać ;) Pozdrawiam, Sławek
Re: [Lazarus][Linux] FindFirst i Attr
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 26 Jul 2007 23:16
Date: Thu, 26 Jul 2007 23:16
29 lines
2036 bytes
2036 bytes
Terrmit wrote: > > Heh, dobra, OK :) > Mnie ewentualnie chodziło o jakąś inną metodę ;) > Ale OK, w sumie to bardzo zależy mi na szybkości działania, > a takie skompensowanie nieco przyspiesza, więc może być :) > Powinno być chyba minimalnie szybciej, ale badać mi się tego > chyba nie chce ;) Minimalnie czy "maxymalnie" szybciej nie będzie, to jest operacja IO, pare instrukcji maszynowych nie stworzy żadnej sensownej różnicy w kontekscie narzutu Linuxowych syscall'i. Także nie ma się o co martwić ;). > Tylko takie "kompresowanie" czasami zaciemnia kod, dlatego > nie można z tym przeginać ;) Imo jest bardziej czytelne, tak można najwyżej narzucić ewaluacje wyrażenia explicitem, aczkolwiek w dzisiejszych językach jest to mało potrzebne. I oczywiście: opcja Kolegi Tygrysa jest jak najbardziej ładniejsza od mojej :). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][Linux] FindFirst i Attr
Author: Terrmit
Date: Thu, 22 Nov 2007 23:10
Date: Thu, 22 Nov 2007 23:10
32 lines
1824 bytes
1824 bytes
W Lazarusie 0.9.24 nie ma już modułu oldlinux.
Zamiast niego jest BaseUnix.
Poprawione procedury będą następujące:
uses BaseUnix;
//Sprawdza, czy plik jest poprawny
//(czy nie jest to np. link symboliczny do pliku)
function IsFileRegular(const FName: string): Boolean;
var info: stat;
begin
Result := false;
if fpLStat(FName, @info)<>0 then
if fpS_ISREG(info.st_mode) then
if not fpS_ISLNK(info.st_mode) then
Result := true;
end;
//Sprawdza, czy katalog jest poprawny
//(czy nie jest to np. link symboliczny do katalogu)
function IsDirRegular(const Dir: string): Boolean;
var info: stat;
begin
Result := false;
if fpLStat(Dir, @info)<>0 then
if fpS_ISDIR(info.st_mode) then
if not fpS_ISLNK(info.st_mode) then
Result := true;
end;
Pozdrawiam,
Sławek Załęcki
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads