To, co chcę osiągnąć, jest bardzo proste: mam aplikację Windows Forms (.NET 3.5), która używa ścieżki do odczytu informacji. Ścieżkę tę może zmodyfikować użytkownik, korzystając z formularza opcji, który podaję.
Teraz chcę zapisać wartość ścieżki do pliku do późniejszego wykorzystania. To byłoby jedno z wielu ustawień zapisanych w tym pliku. Ten plik byłby umieszczony bezpośrednio w folderze aplikacji.
Rozumiem, że dostępne są trzy opcje:
- Plik ConfigurationSettings (appname.exe.config)
- Rejestr
- Niestandardowy plik XML
Przeczytałem, że plik konfiguracyjny .NET nie jest przewidziany do zapisywania w nim wartości. Jeśli chodzi o rejestr, chciałbym oddalić się od niego jak najdalej.
Czy to oznacza, że powinienem użyć niestandardowego pliku XML, aby zapisać ustawienia konfiguracji?
Jeśli tak, chciałbym zobaczyć przykład tego kodu (C #).
Widziałem inne dyskusje na ten temat, ale wciąż nie jest to dla mnie jasne.
źródło
Odpowiedzi:
Jeśli pracujesz z Visual Studio, łatwo jest uzyskać trwałe ustawienia. Kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz Właściwości. Wybierz kartę Ustawienia i kliknij hiperłącze, jeśli ustawienia nie istnieją.
Użyj karty Ustawienia, aby utworzyć ustawienia aplikacji. Visual Studio tworzy pliki
Settings.settings
iSettings.Designer.settings
które zawierają klasę singletonSettings
odziedziczoną ApplicationSettingsBase . Możesz uzyskać dostęp do tej klasy ze swojego kodu, aby odczytać / zapisać ustawienia aplikacji:Ta technika ma zastosowanie zarówno w przypadku konsoli, formularzy Windows i innych typów projektów.
Pamiętaj, że musisz ustawić właściwość scope swoich ustawień. Jeśli wybierzesz zakres aplikacji, wówczas Settings.Default. <Twoja właściwość> będzie tylko do odczytu.
Odniesienia: Porady: Zapisywanie ustawień użytkownika w czasie wykonywania za pomocą C # - Dokumenty Microsoft
źródło
Settings.Default.SomeProperty = 'value'; Settings.Default.Save();
działa jak marzenie. A może dlatego, że mam ustawienia użytkownika?Settings.Default.Save()
nic nie robi, jest nieprawidłowe. Jak stwierdza @aku w odpowiedzi, ustawienia zakresu aplikacji są tylko do odczytu: zapisywanie jest dla nich nieskuteczne. Użyj tego niestandardowego PortableSettingsProvider, aby zapisać ustawienia zakresu użytkownika w pliku app.config, w którym znajduje się plik exe zamiast tego w folderze AppData użytkownika. Nie, ogólnie nie jest dobre, ale używam go podczas programowania, aby używać tych samych ustawień od kompilacji do kompilacji (bez niego, idą nowe unikalne foldery użytkownika z każdą kompilacją).Jeśli planujesz zapisać do pliku w tym samym katalogu co plik wykonywalny, oto fajne rozwiązanie, które używa formatu JSON :
źródło
DEFAULT_FILENAME
, wystarczy zadzwonićsettings.Save(theFileToSaveTo)
; Będąc wszystkimi czapkami,DEFAULT_FILENAME
ma być stałą . Jeśli chcesz mieć właściwość do odczytu i zapisu, utwórz ją i ustaw na nią konstruktorDEFAULT_FILENAME
. Następnie ustaw domyślną wartość argumentu na:null
przetestuj ją i użyj swojej właściwości jako wartości domyślnej. To trochę więcej pisania, ale daje bardziej standardowy interfejs.System.Web.Extensions.dll
jeśli jeszcze tego nie masz.Rejestr jest nie do przejścia. Nie masz pewności, czy użytkownik korzystający z Twojej aplikacji ma wystarczające uprawnienia do zapisu w rejestrze.
Możesz użyć tego
app.config
pliku do zapisania ustawień na poziomie aplikacji (które są takie same dla każdego użytkownika korzystającego z Twojej aplikacji).Zapisałbym ustawienia użytkownika w pliku XML, który zostałby zapisany w Izolowanym magazynie lub w katalogu SpecialFolder.ApplicationData .
Oprócz tego, począwszy od .NET 2.0, możliwe jest przechowywanie wartości z powrotem do
app.config
pliku.źródło
ApplicationSettings
Klasa nie obsługuje zapisywania ustawień do app.config pliku. To bardzo z założenia; aplikacje działające z odpowiednio zabezpieczonym kontem użytkownika (patrz Vista UAC) nie mają dostępu do zapisu w folderze instalacyjnym programu.Możesz walczyć z systemem z
ConfigurationManager
klasą. Ale trywialnym obejściem jest przejście do projektanta ustawień i zmiana zakresu ustawienia na użytkownika. Jeśli powoduje to trudności (powiedzmy, ustawienie dotyczy każdego użytkownika), należy umieścić funkcję Opcje w osobnym programie, aby można było poprosić o monit o podniesienie uprawnień. Lub zrezygnuj z używania ustawienia.źródło
Argument register / configurationSettings / XML nadal wydaje się bardzo aktywny. Wykorzystałem je wszystkie, w miarę postępu technologii, ale mój ulubiony oparty jest na systemie Threeda w połączeniu z Isolated Storage .
Poniższy przykład umożliwia przechowywanie obiektów o nazwie właściwości do pliku w pamięci izolowanej. Jak na przykład:
Właściwości można odzyskać za pomocą:
To tylko próbka, nie sugerująca najlepszych praktyk.
źródło
Chciałem udostępnić bibliotekę, którą dla tego stworzyłem. To niewielka biblioteka, ale duże ulepszenie (IMHO) w stosunku do plików .settings.
Biblioteka nazywa się Jot (GitHub) . Oto stary artykuł The Code Project , który o nim napisałem.
Oto, w jaki sposób możesz go użyć do śledzenia rozmiaru i lokalizacji okna:
Korzyść w porównaniu z plikami .settings: kod jest znacznie mniejszy i jest znacznie mniej podatny na błędy, ponieważ każdą właściwość trzeba podać tylko raz .
W przypadku plików ustawień należy pięć razy wspomnieć o każdej właściwości : raz, gdy jawnie utworzysz właściwość i dodatkowe cztery razy w kodzie, który kopiuje wartości w tę iz powrotem.
Pamięć masowa, serializacja itp. Są w pełni konfigurowalne. Gdy obiekty docelowe są tworzone przez kontener IoC , możesz [podłączyć go] [], aby automatycznie zastosował śledzenie do wszystkich obiektów, które rozwiązuje, tak aby wszystko, co musisz zrobić, aby zachować trwałość właściwości, to uderzenie w [Trackable] atrybut na to.
Jest wysoce konfigurowalny i możesz skonfigurować: - kiedy dane są utrwalane i stosowane globalnie lub dla każdego śledzonego obiektu - jak są serializowane - gdzie są przechowywane (np. Plik, baza danych, online, pamięć izolowana, rejestr) - reguły, które mogą anulować zastosowanie / utrwalanie danych dla właściwości
Zaufaj mi, biblioteka jest na najwyższym poziomie!
źródło
Prostym sposobem jest użycie obiektu danych konfiguracji, zapisanie go jako plik XML z nazwą aplikacji w folderze lokalnym i po uruchomieniu odczyta go ponownie.
Oto przykład przechowywania pozycji i rozmiaru formularza.
Obiekt danych konfiguracji jest silnie typowany i łatwy w użyciu:
Klasa menedżera do zapisywania i ładowania:
Teraz możesz utworzyć instancję i użyć w formularzu zdarzeń ładowania i zamykania:
Utworzony plik XML jest także czytelny:
źródło
c:\program files\my application
folderu, więc zapisanie ustawień powoduje błąd. Zastanawiam się nad zapisaniem pliku xml w AppData, ale po prostu zastanawiałem się, czy istnieje oczywisty sposób na obejście tego problemu, ponieważ wydaje się, że to podejście zadziałało.Nie podoba mi się proponowane rozwiązanie polegające na użyciu
web.config
lubapp.config
. Spróbuj przeczytać swój własny XML. Spójrz na pliki ustawień XML - koniec z web.config .źródło
Inne opcje, zamiast używać niestandardowego pliku XML, możemy użyć bardziej przyjaznego formatu pliku: JSON lub YAML.
Możesz zapisać plik ustawień w wielu specjalnych folderach (dla wszystkich użytkowników i na użytkownika), jak podano tutaj. Środowisko. Specjalne wyliczanie folderów i wiele plików (domyślnie tylko do odczytu, na rolę, na użytkownika itp.)
Jeśli wybierzesz użycie wielu ustawień, możesz scalić te ustawienia: Na przykład scalając ustawienia dla domyślnego + BasicUser + AdminUser. Możesz użyć własnych reguł: ostatnia przesłania wartość itp.
źródło
„Czy to oznacza, że powinienem użyć niestandardowego pliku XML do zapisania ustawień konfiguracji?” Nie, niekoniecznie. Do takich operacji używamy SharpConfig.
Na przykład, jeśli plik konfiguracyjny jest taki
Możemy pobrać takie wartości
Jest kompatybilny z .NET 2.0 i nowszymi wersjami. Pliki konfiguracyjne możemy tworzyć w locie i możemy zapisać później.
Źródło: http://sharpconfig.net/
GitHub: https://github.com/cemdervis/SharpConfig
źródło
O ile mi wiadomo, .NET obsługuje utrzymywanie ustawień przy użyciu wbudowanej funkcji ustawień aplikacji:
źródło
Czasami chcesz pozbyć się tych ustawień przechowywanych w tradycyjnym pliku web.config lub app.config. Chcesz mieć bardziej szczegółową kontrolę nad wdrażaniem wpisów ustawień i oddzielnym projektem danych. Lub wymagane jest, aby umożliwić dodawanie nowych wpisów w czasie wykonywania.
Mogę sobie wyobrazić dwie dobre opcje:
Zaletą mocno wpisanej wersji są mocno wpisane nazwy i wartości ustawień. Nie ma ryzyka mieszania nazw lub typów danych. Wadą jest to, że trzeba zakodować więcej ustawień, których nie można dodać w czasie wykonywania.
W przypadku wersji zorientowanej obiektowej zaletą jest możliwość dodawania nowych ustawień w czasie wykonywania. Ale nie masz mocno wpisanych nazw i wartości. Należy uważać na identyfikatory ciągów. Podczas uzyskiwania wartości należy znać typ danych zapisany wcześniej.
Kod obu w pełni funkcjonalnych implementacji można znaleźć TUTAJ .
źródło
Tak, możliwe jest zapisanie konfiguracji - ale w dużej mierze zależy to od wybranego sposobu. Pozwól mi opisać różnice techniczne, abyś mógł zrozumieć dostępne opcje:
Najpierw musisz rozróżnić, czy chcesz używać applicationSettings czy AppSettings w swoim pliku
*.exe.config
(inaczejApp.config
w Visual Studio) - istnieją podstawowe różnice, które zostały opisane tutaj .Oba zapewniają różne sposoby zapisywania zmian:
config.Save(ConfigurationSaveMode.Modified);
, gdzie config jest zdefiniowany jakoconfig = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
).Properties.Settings.Default.Save();
) będzie napisany na zasadzie per-user, przechowywane w specjalnym miejscu (npC:\Documents and Settings\USERID\Local Settings\Application Data\FIRMNAME\WindowsFormsTestApplicati_Url_tdq2oylz33rzq00sxhvxucu5edw2oghw\1.0.0.0
). Jak wspomniał Hans Passant w swojej odpowiedzi, dzieje się tak dlatego, że użytkownik zwykle ma ograniczone prawa do plików programu i nie może do nich pisać bez wywołania monitu UAC. Wadą jest to, że jeśli dodajesz klucze konfiguracyjne w przyszłości, musisz zsynchronizować je z każdym profilem użytkownika.Uwaga: Jak wspomniano w pytaniu, istnieje trzecia opcja: jeśli traktujesz plik konfiguracyjny jako dokument XML, możesz go załadować, zmodyfikować i zapisać za pomocą
System.Xml.Linq.XDocument
klasy. Nie jest wymagane użycie niestandardowego pliku XML, można odczytać istniejący plik konfiguracyjny; do zapytań o elementy można nawet użyć zapytań Linq. Podałem tutaj przykład , sprawdź funkcjęGetApplicationSetting
w odpowiedzi.Jeśli potrzebujesz szyfrowania w celu ochrony swoich wartości, sprawdź tę odpowiedź.
źródło
źródło