Article View: pl.comp.lang.pascal
Article #92973Re: [Lazarus] Czy nazwa pliku jest poprawna?
From: Terrmit
Date: Mon, 19 Apr 2010 21:35
Date: Mon, 19 Apr 2010 21:35
80 lines
3561 bytes
3561 bytes
W dniu 19.04.2010 19:51, Grzegorz Skoczylas pisze:
[ciach]
>
> 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.
>
Właściwie to już napisałem sobie podobnie działającą funkcję jak
ta ValidFileName, którą przytoczyłeś, choć jest trochę prostsza,
bo wyskrobałem ją na szybko:
function NazwaPoprawna(const FileOrDir: string): Boolean;
var i: Integer;
const NOCHAR = ['\','/',':','*','?','"','<','>','|'];
begin
Result := True;
for i := 1 to Length(FileOrDir) do
if FileOrDir[i] in NOCHAR then begin
Result := False; Break;
end;
end;
Nie jestem pewien, czy to zadziała, gdy w nazwie trafią się
np. polskie literki. Chyba muszę przetestować.
Program ma działać przede wszystkim w Linuksie, ale chciałbym
aby w przyszłości można go było uruchamiać także w Windows.
Metoda z tworzeniem pliku jest chyba najpewniejsza, ale przypomina
nieco sięganie prawą ręką do lewego ucha, czego wolałbym uniknąć.
I sprawdzenie długość faktycznie nie zaszkodziłoby.
Dzięki za wskazówki,
Sławek
Technical Details
Message-ID:
<hqiifa$nri$1@news.mm.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.task.gda.pl!news.mm.pl!not-for-mailReferences:
<hqf56i$e20$1@news.mm.pl> <hqfe26$4v6$1@news.dialog.net.pl> <hqfn6i$1df3$1@news.mm.pl> <hqi57g$ki0$1@news.dialog.net.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.task.gda.pl!news.mm.pl!not-for-mail From: Terrmit <terrmitv@poczta.onet.pl> Newsgroups: pl.comp.lang.pascal Subject: Re: [Lazarus] Czy nazwa pliku jest poprawna? Date: Mon, 19 Apr 2010 23:35:42 +0200 Organization: Multimedia Polska SA Lines: 80 Message-ID: <hqiifa$nri$1@news.mm.pl> References: <hqf56i$e20$1@news.mm.pl> <hqfe26$4v6$1@news.dialog.net.pl> <hqfn6i$1df3$1@news.mm.pl> <hqi57g$ki0$1@news.dialog.net.pl> NNTP-Posting-Host: host-89-231-112-128.warszawa.mm.pl Mime-Version: 1.0 X-Trace: news.mm.pl 1271713066 24434 89.231.112.128 (19 Apr 2010 21:37:46 GMT) X-Complaints-To: abuse@multimedia.pl NNTP-Posting-Date: Mon, 19 Apr 2010 21:37:46 +0000 (UTC) User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.9) Gecko/20100330 Fedora/3.0.4-1.fc12 Lightning/1.0b2pre Thunderbird/3.0.4 In-Reply-To: <hqi57g$ki0$1@news.dialog.net.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit