🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.pascal
Article #92972

Re: [Lazarus] Czy nazwa pliku jest poprawna?

#92972
From: Grzegorz Skoczylas
Date: Mon, 19 Apr 2010 17:51
76 lines
3585 bytes
W dniu 2010-04-18 21:37, Terrmit pisze:
> W dniu 18.04.2010 19:03, Grzegorz Skoczylas pisze:
>> W dniu 2010-04-18 16:30, Terrmit pisze:
>>> Witam,
>>>
>>> Może ktoś mi podpowie.
>>> Potrzeba mi funkcja, która sprawdza, czy w podana nazwa
>>> pliku (katalogu) jest poprawna, tzn. czy nie zawiera
>>> niedozwolonych znaków (\ /: * ? " < > |).
>>> Czy we freepascalu istnieje taka funkcja?
>>> Pytam, bo nie mogę takiej znaleźć.
>>> Mogę sobie oczywiście napisać, ale jeśli taka funkcja jest
>>> to wolałbym ją wykorzystać, a nie wyważać otwarte drzwi.
>>> Jakoś nie chce mi się wierzyć, że nie ma takiego sprawdzania.
>>
>> W Delphi w module SysUtils jest funkcja "IsValidIdent". Sprawdź, czy
>> Lazarus też ma taką funkcję w tym module.
>>
> Jest taka funkcja, ale ona służy raczej do sprawdzania nazwy
> komponentu [...]

Faktycznie. Pomyliłem się.

W JEDI znalazłem taką funkcję:

function ValidFileName(const FileName: string): Boolean;

   function HasAny(const Str, Substr: string): Boolean;
   var
     I: Integer;
   begin
     Result := False;
     for I := 1 to Length(Substr) do
     begin
       if Pos(Substr[I], Str) > 0 then
       begin
         Result := True;
         Break;
       end;
     end;
   end;

begin
   Result := (FileName <> '') and (not HasAny(FileName, '/<>"?*|'));
   if Result then
     Result := Pos('\', ExtractFileName(FileName)) = 0;
end;


To oczywiście dotyczy systemu Windows. Właściwie należałoby jeszcze 
sprawdzić, czy pełna ścieżka do pliku nie przekracza 260 znaków (w 
Delphi stała MAX_PATH z modułu Windows).

Nie wiem, jakie są ograniczenia w Linux czy MacOS-X.

Jeżeli miałoby to być niezależnie od systemu, to można do tego podejść 
może niezbyt optymalnie, ale za to chyba niezawodnie:

1. Sprawdzić, czy taki plik już istnieje. Jeżeli istnieje - to jest 
poprawna nazwa pliku.
2. Spróbować utworzyć taki plik. Jeżeli się uda, to nazwa jest poprawna, 
a utworzony plik usunąć z dysku. Jeżeli się nie uda, to nazwa nie jest 
poprawna.

Powyższy algorytm będzie działać w folderach, do których aplikacja ma 
pełne prawa. Nie zadziała np. w folderze "c:\Program Files" lub 
"c:\Windows" w Windows Vista i późniejszych. Może też nie zadziałać w 
przypadku dysków sieciowych, do których aplikacja (użytkownik) nie ma 
pełnych praw.

-- 
Pozdrawiam,

Grzegorz Skoczylas
http://gskoczylas.rekord.pl
----------------------------------------------
Technical Details
Message-ID: <hqi57g$ki0$1@news.dialog.net.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
References: <hqf56i$e20$1@news.mm.pl> <hqfe26$4v6$1@news.dialog.net.pl> <hqfn6i$1df3$1@news.mm.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail
From: Grzegorz Skoczylas <gskoczylas@kasuj-to.rekord.pl>
Newsgroups: pl.comp.lang.pascal
Subject: Re: [Lazarus] Czy nazwa pliku jest poprawna?
Date: Mon, 19 Apr 2010 19:51:47 +0200
Organization: Dialog Net
Lines: 76
Message-ID: <hqi57g$ki0$1@news.dialog.net.pl>
References: <hqf56i$e20$1@news.mm.pl> <hqfe26$4v6$1@news.dialog.net.pl> <hqfn6i$1df3$1@news.mm.pl>
NNTP-Posting-Host: 78.8.107.47
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1271699504 21056 78.8.107.47 (19 Apr 2010 17:51:44 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Mon, 19 Apr 2010 17:51:44 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.8.1.23) Gecko/20090812 Thunderbird/2.0.0.23 Mnenhy/0.7.6.666
In-Reply-To: <hqfn6i$1df3$1@news.mm.pl>
X-Antivirus: avast! (VPS 100419-0, 2010-04-19), Outbound message
X-Antivirus-Status: Clean
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit