Muszę napisać plik w tym samym folderze, w którym znajduje się konsola ClickOnce .application
(plik wykonywalny). Folder, z którego jest uruchamiany.
Próbowałem użyć Application.StartupPath
&, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
ale ścieżka wskazuje na podfolder pod c:\Documents & Settings
. Jak uzyskać ścieżkę, w której .application
mieszka?
Zgadza się.
ClickOnce applications
są instalowane w profilu użytkownika, który je zainstalował. Czy wybrałeś ścieżkę, którą dało ci pobranie informacji z zespołu wykonawczego i poszedłeś to sprawdzić?W systemie Windows Vista i Windows 7 pamięć podręczną ClickOnce znajdziesz tutaj:
W systemie Windows XP znajdziesz go tutaj:
źródło
ApplicationDeployment.CurrentDeployment.ActivationUri może działać
„Ciąg o zerowej długości, jeśli właściwość TrustUrlParameters w manifeście wdrożenia ma wartość false lub jeśli użytkownik podał UNC do otwarcia wdrożenia lub otworzył je lokalnie. W przeciwnym razie wartością zwracaną jest pełny adres URL używany do uruchomienia aplikacji, w tym wszelkie parametry. ”
ALE to, co myślę, że naprawdę chcesz, to ApplicationDeployment.CurrentDeployment.DataDirectory, który udostępnia folder, w którym możesz zapisywać dane. Po zaktualizowaniu aplikacji i tak utracisz zawartość oryginalnego folderu .exe, ale możesz przenieść katalog danych do nowej wersji aplikacji. Twoja aplikacja może zapisywać w tym folderze za pomocą dowolnych plików dziennika, które ma - i jestem prawie pewien, że gwarantuje on możliwość zapisu.
źródło
Używam
Assembly.GetExecutingAssembly().Location
do uzyskania ścieżki doClickOnce
wdrożonej aplikacji w .Net 4.5.1.Jednak nie należy zapisywać w żadnym folderze, w którym aplikacja jest wdrażana, niezależnie od metody wdrażania (xcopy, ClickOnce, InstallShield, cokolwiek), ponieważ są one zwykle tylko do odczytu dla aplikacji, szczególnie w nowszych wersjach systemu Windows i środowiskach serwerowych.
Aplikacja musi zawsze zapisywać w folderach zarezerwowanych do takich celów. Możesz pobrać potrzebne foldery, zaczynając od Environment.SpecialFolder Enumeration. Strona MSDN wyjaśnia, do czego służy każdy folder: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
Tj. Dane, logi i inne pliki, z których można korzystać
ApplicationData
(roaming),LocalApplicationData
(lokalnie) lubCommonApplicationData
. W przypadku plików tymczasowych użyjPath.GetTempPath
lubPath.GetTempFileName
.Powyższe działa również na serwerach i komputerach stacjonarnych.
EDYCJA:
Assembly.GetExecutingAssembly()
jest wywoływana w głównym pliku wykonywalnym.źródło
Aplikacji ClickOnce DO rezydować w podkatalogu C: \ Documents & Settings. Nie mają „czystych” katalogów instalacyjnych, ponieważ pliki lokalne są w zasadzie pobierane „tymczasowo”, aby umożliwić działanie aplikacji na lokalnym komputerze, a wykonywanie aplikacji jest kontrolowane z serwera ClickOnce, na którym są wdrażane, w zależności od ustawień publikowania (Sprawdzanie aktualizacji, wymagań dotyczących wersji itp.).
źródło
Oto, co znalazłem, co zadziałało, aby uzyskać lokalizację wdrożonego folderu mojej aplikacji Clickonce i nie zostało nigdzie wspomniane w moich wyszukiwaniach, dla mojego podobnego, konkretnego scenariusza:
Oto wizualizacja mojego przypadku użycia:
Nie znalazłem żadnych sugestii w tym pytaniu ani ich komentarzy do pracy przy zwracaniu folderu, w którym wdrożono aplikację Clickonce (do którego następnie przenosiłbym się względem tego folderu, aby znaleźć interesujący folder). Żadne inne wyszukiwanie w Internecie ani powiązane pytania SO również nie przyniosły odpowiedzi.
Wszystkie sugerowane właściwości albo kończyły się niepowodzeniem, ponieważ obiekt (np. ActivationUri) był pusty, albo wskazywały na folder zainstalowanej aplikacji w pamięci podręcznej lokalnego komputera. Tak, mogłem z wdziękiem obsługiwać obiekty zerowe, sprawdzając IsNetworkDeployed - to nie jest problem - ale, co zaskakujące, IsNetworkDeployed zwraca wartość false, mimo że w rzeczywistości mam lokalizację folderu wdrożonego w sieci dla aplikacji Clickonce. Dzieje się tak, ponieważ aplikacja jest uruchamiana z lokalnych, zbuforowanych bitów.
Rozwiązaniem jest przyjrzenie się:
AppDomain.CurrentDomain.BaseDirectory
gdy aplikacja jest uruchamiana w Visual Studio w miarę rozwoju iSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
gdy wykonuje się normalnie.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
we wszystkich przypadkach poprawnie zwraca katalog sieciowy, w którym moja aplikacja Clickonce jest wdrożona. To znaczy, gdy jest uruchamiany przez:Oto kod, którego używam podczas uruchamiania aplikacji, aby uzyskać ścieżkę do folderu WorkAccounts. Uzyskanie folderu wdrożonej aplikacji jest proste, ponieważ nie prowadzi się do katalogów nadrzędnych:
źródło
Zakładając, że pytanie dotyczy dostępu do plików w folderze aplikacji po zainstalowaniu aplikacji ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) na komputerze użytkownika, istnieją trzy sposoby uzyskania tego folderu przez samą aplikację:
Działają one z VS IDE i z wdrożonej / zainstalowanej aplikacji ClickedOnce, nie jest wymagane sprawdzenie „true == System.Deployment.ApplicationDeploy.IsNetworkDeployed”. ClickOnce przejmuje wszystkie pliki zawarte w projekcie programu Visual Studio 2017, dzięki czemu aplikacja może uzyskać dostęp do wszystkich wdrożonych plików przy użyciu ścieżek względnych z poziomu aplikacji.
Jest to oparte na systemie Windows 10 i programie Visual Studio 2017
źródło