Article View: pl.comp.lang.pascal
Article #92972Re: [Lazarus] Czy nazwa pliku jest poprawna?
From: Grzegorz Skoczylas
Date: Mon, 19 Apr 2010 17:51
Date: Mon, 19 Apr 2010 17:51
76 lines
3585 bytes
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-mailReferences:
<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