Aplikacja nie widzi swoich plików po uruchomieniu z autostartu.

0

Cześć.
Mam aplikację, której działanie uwarunkowane jest istnieniem dwóch plików.
Problem w tym że jeśli aplikacja zostanie uruchomiona z autostartu (HKCU\Microsoft\Windows\Current Version\Run), to aplikacja nie widzi tych plików. Jeśli jednak wrzucę skrót do katalogu autostart, to działa wszystko.
Ma ktoś jakieś pomysły? Do sprawdzania czy pliki istnieją używam funkcji

FileExists(ExtractFilePath(Application.ExeName)+'plik.dat')
1
gienekr napisał(a)

Mam aplikację, której działanie uwarunkowane jest istnieniem dwóch plików.
Problem w tym że jeśli aplikacja zostanie uruchomiona z autostartu to aplikacja nie widzi tych plików.

Jeśli chodzi o system Windows XP spotkałem się już z pewną niejasnością; Mianowicie ścieżka aplikacji (a zarazem jej pierwszy parametr - ParamStr(0)) może być różny w zależności od tego skąd się ją uruchamia; Z regóły jeśli uruchomisz ręcznie apliakcję z dysku (ścieżka przykładowa: C:\App.exe) jej pierwszy parametr będzie równy C:\App.exe, a także właściwość Application.ExeName przechowuje wartość C:\App.exe; Czasem (nie napiszę teraz dokładnie bo niebardzo pamiętam) jednak gdy uruchomiłem aplikację ścieżka zmieniała się np. na C:\Documents and Settings\UserName\Pulpit\App.exe; Nie pamiętam kiedy tak się działo, wiem, że to było bardzo dawno temu jak dopiero co uczyłem się programować, ale ścieżka wskazywała na pulpit;

Problem rozwiązałem dodając klucz do rejestu w gałęzi HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\App.exe i ustawiając wartość domyślną (wartość o pustym identyfikatorze) na katalog, w którym znajduje się plik wykonywalny aplikacji; Od tamtej pory nigdy nie zdarzyło się, by ścieżka wskazywała na niewłaściwy katalog;

Dlaczego o tym piszę? Ponieważ najprawdopodobniej program szuka tych dwóch plików w katalogu, w którym ich nie ma; Jeżeli apliakcja nie będzie przenoszona (zwykle się tego nie praktykuje) możesz na stałe określić jej ścieżkę, a tym samym pozbyć się bugów dodając wcześniej wspomniany klucz do rejestru systemu;

Jeśli będziesz chciał sprawdzić, czy te dwa plikiistnieją na dysku, pobierzesz ścieżkę z rejestu i dodasz do niej nazwy tych dwóch plików, po czym sprawdzisz funkcją FileExists czy istnieją i wykonasz dalsze czynności;

W gałęzi HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\ większość aplikacji dodaje swoje ścieżki, a także inne dodatkowe informacje; Sprawdź sam; W nowszych Windows'ach będzie tak samo, lub podobnie;

0

Cześć.
Wygląda na to że problem naprawiłem - wystarczyło dodać "" przed nazwą pliku:

 FileExists(ExtractFilePath(Application.ExeName)+'\plik.dat')

Ale muszę to jeszcze dokładniej przetestować

0

Nie zauważyłem, że nie dodajesz / do ścieżki...

Dopiszę jeszcze, że opisany przeze mnie powyżej sposób jest praktyczny jedynie w przypadku, gdy aplikacja posiada swój własny instalator; Ścieżkę do rejestru podaje się podczas instalowania programu, więc zawsze będzie taka, jaką wskazał użytkownik i będzie w 100% działać (do czasu formata, lub usunięcia przez nierozgarniętego użyszkodnika);

Oprogramuj sobie także sprawdzanie, czy wymagany klucz istnieje w rejestrze; Jeżeli nie istnieje to musisz wypakować ścieżkę z parametru i sprawdzić, czy wszyskie pliki są na swoim miejscu względem jej; jeśli wszystkie istnieją - dodajesz klucz do rejestru ze ścieżką pobraną z parametru; Musisz sprawdzić, czy pliki istnieją, bo jeżeli nie a dodasz ją do rejestru to zawsze już po odczytaniu jej będą wyskakiwać błedy, bo większość plików (albo nawet wsystkie) nie będą istnieć pod błędną ścieżką;

Przetestuj sobie ten sposób i sotosuj w każdej większej aplikacji, która będzie instalowana na dysku;

1 użytkowników online, w tym zalogowanych: 0, gości: 1