Nie dotykaj Program Files!
Jest sobie taki katalog, w którym większość instalowanych pod Windows aplikacji ląduje. Program Files. I są aplikacje, które sobie swoje dane konfiguracyjne zapisują w swoim podkatalogu tegoż systemowego folderu. W jakiś plikach INI, XML - nieważne. Fakt jest jednak taki, że niestety rzadko programiści (amatorzy - w przypadku komercyjnych aplikacji tego problemu nie zauważyłem) zwracają uwagę na fakt, że użytkownik niekoniecznie musi mieć prawa zapisu do katalogu aplikacji! I wtedy piękne “Cannot create file” czy inny nieobsłużony wyjątek środowiska programistycznego się pojawia. Bo kto by o tym pomyślał, ze czasy Windows 9x się skończyły, a konta administracyjnego się nie używa?
Sam przyznaję, ten błąd popełniliśmy w PilotMP3. I Notatniku SP. Ale gdzieś go jeszcze widziałem w paru programach. A odkryłem tę sytuację praktycznie przypadkiem. Pod Windows XP używałem konta “Użytkownik zaawansowany”, które akurat prawa zapisu do Program Files ma (ale do Windows - nie). Ale siadłem do Visty i używam konta administratora. Jednak jestem chroniony przez UAC (User Account Control) i każda akcja poważniejsza wymaga potwierdzenia, w tym także zapis do Program Files. Niestety, używałem pewnej aplikacji, która systemowi nie zgłosiła zapotrzebowania na uprawnienia administracyjne (co w sumie normalne - raz, że o Viście to nie słyszano gdy ją pisano, dwa - bo nie robi nic specjalnego), próbowała zapisać do swojego katalogu… i wyskoczył błąd. No trudno się mówi. Ale ja chcę zamknąć program - błąd! Bo nie może zapisać konfiguracji. I wyjść się inaczej niż przez zabicie procesu nie da…
Zapis konfiguracji do katalogu aplikacji jest zły. Po to dano nam w systemie Windows 2000/XP/Vista katalog Documents and Settings[konto]Dane aplikacji (względnie Users[kontoAppData w Viście, na który przekierowywany jest link ze starszych systemów - podziękujmy łączom stałym), aby w nim takie rzeczy zapisywać.
W PilotMP3 1.1 (obecnie faza RC) zastosowałem pewną bardzo skomplikowaną z pozoru funkcję, która uwzględnia kilka różnych przypadków folderów gdzie dane programu można zapisać. Ogólnie zaczyna ona od zapisania w folderze, którego ścieżkę pobiera ze zmiennej środowiskowej %APPDATA%. Jeżeli jest pusta, to oznacza, że mamy do czynienia z systemem Windows 98/ME - a więc wtedy ustalamy katalog roboczy na katalog aplikacji. Jeżeli mamy już jednak ścieżkę do "Danych aplikacji" to próbujemy tam utworzyć podkatalogi jeśli ich nie ma. Albo zapisujemy tam gdzie trzeba. Ale, jeżeli zapis się nie uda - to zapisujemy dane do katalogu tymczasowego, którego ścieżkę pobiera się ze zmiennej środowiskowej %TEMP%. A do niego to każdy zapisać może. Co najwyżej dane znikną (w rzeczywistości dochodzi jeszcze warunek próbowania zapisu w Temp - jeśli się nie powiedzie to program generuje fatalne zakończenie aplikacji z wyjątkiem $FF).
Nie dotykać katalogów, do których się nie ma absolutnej pewności, że będzie można zapisać. Bo uruchamianie aplikacji z prawami administratora chyba mija się z celem. Programiści - macie aplikacje, które do swoich katalogów zapisują dane? Przepiszcie je. Żeby użytkownikom było lepiej.
Technorati Tags: Microsoft, Windows, Vista, UAC, programming, Program Files