2009-02-23 9 views
11

Nasze aplikacje win32 (napisane w C++) działają już od ponad 10 lat i nie zostały zaktualizowane, aby przestrzegać "dobrych praktyk" w zakresie miejsca przechowywania plików. Aplikacja domyślnie instaluje się w folderze "C: \ AppName" i przechowuje pliki generowane przez aplikacje, pliki konfiguracyjne, pobrane pliki i zapisane dokumenty użytkownika w podfolderach tego folderu.Gdzie mój program win32 powinien przechowywać swoje pliki?

Prawdopodobnie jest to "najlepsza praktyka" domyślnie instalowana w "c: \ Program Files \ AppName" w dzisiejszych czasach. Ale jeśli to zrobimy, gdzie powinniśmy zachować resztę naszych plików? Począwszy od Vista, zapisywanie w folderze plików programu jest problematyczne i wydaje się, że istnieje milion innych miejsc, w których można umieścić różne pliki i jestem zdezorientowany.

Czy istnieje odniesienie do tego, co się dzieje?


Edycja: Aby rozwinąć na pytania osób pytało tej pory:


jestem zaznajomiony z funkcją funkcji SHGetFolderPath, ale istnieje wiele, wiele opcji, które można uzyskać od to i nie mogę znaleźć zasobu, który mówi "Oto dokładnie, do czego każda z tych opcji jest używana i kiedy zechcesz jej użyć".

Do tej pory zrobiliśmy "Wszystkie pliki, w tym zapisane pliki użytkownika, pod jednym folderem" i wszystko działało dobrze - ale nie wtedy, gdy użytkownicy chcą zainstalować aplikację w folderze Program Files. Z jakiegoś powodu wirtualizacja małpowania wokół tej Vista nie działa dla naszej aplikacji; jeśli i tak zamierzamy wprowadzać zmiany, równie dobrze możemy starać się robić rzeczy "w odpowiedni sposób", ponieważ nie chcemy ich zmieniać w ciągu 12 miesięcy.


Dalsze pytanie:


Mamy zawierać pewne "próbka" dokumenty z naszej aplikacji, które aktualizują się co jakiś czas. Czy warto instalować je w Moich Dokumentach, jeśli będziemy je nadpisywać co kilka miesięcy? A może My Documents jest całkowicie bezpieczny dla użytkowników?

Jeśli nie możemy zainstalować ich w folderze Moje dokumenty, gdzie powinniśmy je umieścić, aby użytkownicy mogli je łatwo zobaczyć?

+1

To nie tylko vista: Podejrzewam, że jeśli przetestujesz swoją aplikację w XP, działając jako _standardowy użytkownik_, będziesz mieć takie same problemy z instalacją istniejącej konfiguracji w folderze plików programu. –

Odpowiedz

15

Można przypuszczać, że to "najlepsze praktyki" domyślne do instalacji pod "C: \ Program Files \ AppName"

blisko, ale nie całkiem. Użytkownicy mogą konfigurować nazwę folderu Program Files i mogą nie mieć nawet dysku C :. Zamiast tego należy zainstalować w folderze zmiennych środowiskowych %ProgramFiles%\AppName. Pamiętaj, że powinieneś założyć, że masz dostęp do tego folderu tylko do odczytu po zakończeniu instalacji.

W przypadku plików danych programu, w których może być potrzebny dostęp do zapisu, należy użyć %AppData%\AppName.

Czy na pewno jesteś jedyną aplikacją o tej nazwie? Jeśli nie jesteś w 100% pewien tego, możesz również podać nazwę swojej firmy.

Mechanizmy używane do pobierania tych zmiennych będą różnić się w zależności od platformy programistycznej. Zwykle sprowadza się to do metody Win32 w końcu na SHGetFolderPath(), ale różne platformy, takie jak Java lub .Net, mogą również dostarczać prostsze abstrakcje.

+0

Byłem w połowie mówiąc to samo, gdy załadowałem tę odpowiedź. +1 – Randolpho

+0

Czy widziałem cię wcześniej, Randolpho? –

+0

Prawdopodobnie często tam wracałem w ciągu dnia. Teraz mam przepełnione stosy pod skórą. :) – Randolpho

6

Użyj funkcji Windows SHGetFolderPath(), aby uzyskać poprawne katalogi.

Edit: Aby odpowiedzieć na inne pytanie, dodane w EDIT: gdzie umieścić przykładowe pliki aplikacji jest bardzo dużo zależy od tego, czy aplikacja jest zainstalowana dla jednego użytkownika lub dla wszystkich użytkowników, oraz czy można założyć, że osoba instalująca aplikację jest tą, która go używa.

Jeśli twój program ma być używany przez wielu użytkowników w systemie, kopiowanie rzeczy do "Moich dokumentów" nie będzie działać - pliki będą dostępne tylko dla użytkownika instalującego aplikację. Co gorsza, jeśli jedyny użytkownik twojej aplikacji musi zostać zainstalowany jako Administrator, to nie będzie miał dostępu również do plików. Jeśli więc nie masz pewności, że do aplikacji jest tylko jeden użytkownik i mają wystarczające uprawnienia do zainstalowania aplikacji przy użyciu własnego konta, nie używaj "Moich dokumentów".

IMO należy zainstalować przykładowe pliki do katalogu określonego przez CSIDL _ COMMON _ APPDATA. Otrzymasz dokładnie jedną kopię dla wszystkich użytkowników, a ponieważ chcesz, aby każdy użytkownik zobaczył oryginalne, niezmienione przykładowe pliki, wszyscy użytkownicy powinni traktować je jako tylko do odczytu. W rzeczywistości program instalacyjny prawdopodobnie powinien sprawić, że będą one tylko do odczytu. Otwieranie jednej z próbek będzie działać dla wszystkich użytkowników, ale gdy tylko spróbują zapisać swoje modyfikacje, aplikacja powinna wykryć, że plik jest tylko do odczytu, i otworzyć okno dialogowe "Zapisz jako", wskazując "Moje dokumenty" lub odpowiednie katalog wewnątrz. Zachowa to również wszystkie modyfikacje użytkownika, gdy instalator zaktualizuje później przykładowe pliki.

Jest oczywiście nieco trudniejsze dla użytkowników znalezienie przykładowych plików. Możesz dodać łącze do folderu próbek do grupy menu początkowego aplikacji, dzięki czemu dostęp do plików jest szybki i oczywiście należy odpowiednio udokumentować wszystko.

+0

Przyjemnie idzie ze spadkiem. Chcesz wyjaśnić rozumowanie, jeśli takie istnieją? – mghie

+0

Niezwiązane z żadną wersją "Uwaga od wersji Windows Vista, ta funkcja jest jedynie opakowaniem dla SHGetKnownFolderPath. Wartość CSIDL jest tłumaczona na skojarzony identyfikator KNOWNFOLDERID, a następnie SHGetKnownFolderPath. Nowe aplikacje powinny używać znanego systemu folderów ..." – JMD

+0

Dobra uwaga, zmieniłem moją odpowiedź. –

-2

Mamy podobną aplikację utworzoną ~ 10 lat temu za pomocą MFC. Najłatwiej było utworzyć folder bezpośrednio z C: \ (np. C: \ OurApp). Bez plików instalacyjnych, bez specjalnych uprawnień, bez zmian w rejestrze itp. Klienci (w szczególności ich administratorzy sys) UWIELBIAM to.

Jeszcze jedno pytanie - czy planujesz nagle zmienić folder instalacyjny dla istniejących klientów (zakładając, że jest zainstalowany w wielu lokalizacjach)? Jeśli coś nie jest zepsute, po co to naprawić?

+0

Myślę, że to dokładnie ten wzór, który próbuje poprawić. – JMD

+0

SysAdmins w tych dniach nie są już tak podekscytowani. Ponieważ użytkownicy nie mają tam uprawnień, domyślnie wdrożenie jest kłopotliwe. –

+0

Nie instalując plików instalacyjnych, w jaki sposób użytkownicy ją odinstalowują? Czy kiedykolwiek testowałeś instalację i działanie z ograniczonym użytkownikiem XP lub standardowym użytkownikiem Vista? –

-1

Istnieje struktura katalogów pod c: \ users dla danych zorientowanych na użytkownika.

Istnieje dokumentacja do przenoszenia aplikacji ze starszych systemów operacyjnych Windows na Vista.

Zapoznaj się z http://www.innovateon.com i postępuj zgodnie z linkami do Vista. Istnieje dokumentacja dotycząca certyfikacji, która zawiera szczegółowe informacje na takie tematy.

+0

-1, nie jest zdefiniowany jako C: \. W moich instalacjach wielu firm czasem było przypisywane na przykład J: \. Dobre czasy. –

+0

Na 99% komputerów jest to c: \. Najważniejsze jest to, że istnieje dokumentacja, która mówi ludziom, jak portować do Vista, gdzie umieścić rzeczy itp. Oto link "bliżej": http://www.innovateon.com/pageLayout.aspx?pageID = VistaCertBuild Spójrz na dokumentację wymagań. – sebastus

-1

Niestety nie znam poprawnej odpowiedzi, ale ...

Czy masz business case dla chcących zrobić? Czy Twoi klienci skarżą się, że pliki nie są przechowywane tam, gdzie oczekują? Czy twoje aplikacje są w jakiś sposób kalekie, ponieważ przechowujesz pliki w niestandardowych lokalizacjach? Jeśli nie, nie widzę powodu, aby spędzać czas i budżet, aby zmienić strategię przechowywania plików tylko po to, aby spełnić "najlepszą" praktykę.Jeśli Twoje programy działają, to IMHO powinieneś zostawić je w spokoju i wydawać pieniądze i czas na rzeczy, które są ważne.

+0

Występuje bardzo realne ryzyko, że program nie będzie działał pod kontami innych niż administrator w systemie Vista i nowszych wersjach systemu Windows. To może być wyrok śmierci dla aplikacji w środowiskach korporacyjnych. – mghie

+0

Ach, dobrze wiedzieć. Dzięki. Oznacza to, że jego aplikacje mogą być w jakiś sposób kaleką, a on rzeczywiście ma uzasadnione uzasadnienie biznesowe. –

9

Niektóre wskazówki znajdują się w tym artykule bazy wiedzy: How to write a Windows XP Application that stores user and application data in the correct location by using Visual C++. Ponadto, jeśli wyszukujesz MSDN dla program Logo systemu Windows znajdziesz dokumentację dotyczącą tego, co aplikacja musi zrobić, aby była prawdziwie zgodna.

SHGetKnownFolderPath może uzyskać potrzebne katalogi. Jeśli wymagana jest zgodność wstecz z XP i wcześniejszych, użyj przestarzałe SHGetFolderPath

Mimo, że jeśli aplikacja przyszedł z dokumentacji, że powiedział „wszystko używane przez tej aplikacji jest w katalogu” Chciałbym miłość to;)

+0

FYI, Zostawiłem komentarz z odpowiedzią mghie, że MSFT mówi, że SHGetFolderPath jest przestarzałe na rzecz SHGetKnownFolderPath. – JMD

+0

Polecenie menu z napisem "Pokaż pomocniczy folder plików", który otwiera Eksploratora do odpowiedniego folderu, również jest niesamowite. –

0

Istnieje wiele zmiennych środowiskowych, takich jak:% USERPROFILE%,% HOMEPATH%,% APPDATA% wszystkie te punkty odnoszą się do niektórych katalogów użytkownika, w których można umieścić swoje pliki użytkownika.

Do przechowywania w całym systemie można użyć% ALLUSERSPROFILE%, to jest miejsce, w którym należy umieścić pliki danych do odczytu/zapisu, które nie są specyficzne dla żadnego użytkownika.

2

Dla plików binarnych aplikacji można założyć, że można pisać do katalogu PLIKÓW PROGRAMU (użyj zmiennej środowiskowej% ProgramFiles% do obsługi instalacji innych niż domyślna wersja angielska - np. W niemieckich instalacjach będzie to c: \ Program domyślnie). Wikipedia zawiera listę najczęściej używanych zmiennych. Inną opcją są funkcje SHGetFolderPath lub nowsze SHGetKnownFolderPath.

Dla danych użytkownika należy założyć, że aplikacja działa z ograniczonymi prawami dostępu i może zapisywać tylko w katalogu domowym użytkownika. To samo dotyczy wpisów w rejestrze. Ścieżka ta powinna prawdopodobnie być konfigurowalna dla użytkownika, ponieważ katalog domowy może w rzeczywistości być serwerem sieciowym, a użytkownik może mieć drugi dysk podłączony do przechowywania danych. Aby uzyskać informacje na temat aktualnych wytycznych systemu plików (Vista), zobacz this article.

Jeśli chodzi o wtyczki, może to być bardziej skomplikowane. Najlepsze połączenia próbne oferują opcję instalacji tylko dla bieżącego użytkownika i umieszczenia wtyczki w katalogu użytkownika lub instalacji dla wszystkich użytkowników i umieszczenia plików w katalogu plików programu (ale pamiętaj, aby sprawdzić uprawnienia do zapisu i żądania w razie potrzeby możliwy dostęp).

+0

Przydatny link białego papieru - dzięki! – Colen