ClickOnce 응용 프로그램의 폴더 경로를 얻는 방법


160

콘솔 ClickOnce와 동일한 폴더에 파일을 작성해야합니다. .application (실행 파일) 합니다. 폴더가 시작되는 폴더입니다.

Application.StartupPath&를 사용해 보았지만 Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 경로가 아래의 하위 폴더를 가리키고 c:\Documents & Settings있습니다. 거주자가있는 경로는 어떻게 알 수 .application있습니까?

답변:


253

폴더 위치를 찾으려면 앱을 실행하고 작업 관리자 (CTRL-SHIFT-ESC)를 열고 앱을 선택한 다음 파일 위치를 마우스 오른쪽 버튼으로 클릭하면됩니다.


3
프로 팁! 오래된 오래된 XP 컴퓨터에서는 사용할 수 없습니다. :)
Jalal

5
"구겨진 기계"에 대한 @Jalal은 www.SysInternals.com에서 Process Explorer를 다운로드하십시오. Win7의 TaskManager 변경 사항이 의심되고 Win8이 방금 복사되었습니다.
Arioch 'The

1
고객의 컴퓨터에서 실행되는 응용 프로그램에서 어떻게 이것을 달성합니까?
user3285954

2
필연적으로 필요한 로그 파일을 삭제하기 때문에 응용 프로그램을 실행할 수 없으면 어떻게합니까?
Tomáš Zato-복원 모니카

2
@Tony_Henrich 당신은 이것을 정답으로 표시해야합니다
sparkyShorts

120

경로가 c : \ Documents & Settings에서 하위 폴더를 가리키고 있습니다.

맞습니다. ClickOnce applications설치 한 사용자의 프로필 아래에 설치됩니다. 실행중인 어셈블리에서 정보를 검색 한 경로를 확인하고 확인 했습니까?

Windows Vista 및 Windows 7의 경우 ClickOnce 캐시가 여기에 있습니다.

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

Windows XP의 경우 여기에서 찾을 수 있습니다.

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername

1
나는이 모든 것을 이해합니다. 앱을 클릭 한 폴더를 원합니다. C : \ Documents and Settings에 액세스 할 수 없으므로 해당 함수에서 반환 한 폴더 경로를 사용하고 하드 코딩 된 경로 값을 사용하지 않으려는 경우 로그 파일에 액세스 할 수 없습니다 .
Tony_Henrich

25

ApplicationDeployment.CurrentDeployment.ActivationUri 가 작동 할 수 있습니다

"배치 매니페스트의 TrustUrlParameters 속성이 false이거나 사용자가 UNC를 제공하여 배포를 열거 나 로컬에서 열면 길이가 0 인 문자열입니다. 그렇지 않으면 반환 값은 응용 프로그램을 시작하는 데 사용되는 전체 URL입니다. 모든 매개 변수를 포함합니다. "


그러나 실제로 원하는 것은 ApplicationDeployment.CurrentDeployment.DataDirectory 이며 데이터를 쓸 수있는 폴더를 제공합니다. 어쨌든 응용 프로그램을 업데이트하면 원래 .exe 폴더에 있던 내용이 손실되지만 데이터 디렉토리를 새 버전의 앱으로 마이그레이션 할 수 있습니다. 귀하의 앱은 모든 로그 파일을 사용 하여이 폴더에 쓸 수 있으며 쓰기 가능하다고 확신합니다.


나는 아무것도하지 않았지만 배포 후 이전 DataDirectory의 파일이 새 DataDirectory에 자동으로 복사됩니다. .pre 디렉토리도 없습니다. (.NET Framework 3.5 및 4.5)
Der_Meister 7

15

나는 Assembly.GetExecutingAssembly().Location경로를 얻기 위해 사용 하고 있습니다.ClickOnce.Net 4.5.1에서 배포 된 응용 프로그램 있습니다.

그러나 배포 방법 (xcopy, ClickOnce, InstallShield 등)에 관계없이 응용 프로그램이 배포 된 폴더에는 일반적으로 응용 프로그램, 특히 최신 Windows 버전 및 서버 환경에서 읽기 전용이므로 폴더에 쓰면 안됩니다.

앱은 항상 그러한 목적으로 예약 된 폴더에 기록해야합니다. Environment.SpecialFolder Enumeration에서 필요한 폴더를 얻을 수 있습니다. MSDN 페이지는 각 폴더의 용도를 설명합니다. http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

즉, 데이터, 로그 및 기타 파일 ApplicationData(로밍), LocalApplicationData(로컬) 또는을 사용할 수 있습니다 CommonApplicationData. 임시 파일의 경우 Path.GetTempPath또는을 사용하십시오 Path.GetTempFileName.

위의 내용은 서버 및 데스크탑에서도 작동합니다.

편집 : Assembly.GetExecutingAssembly()기본 실행 파일에서 호출됩니다.


이것은 ClickOnce 앱에서 작동했으며 VS dev 환경에서도 동일한 앱을 디버깅하는 동안 작동했습니다.
개발자

3

ClickOnce를 응용 프로그램은 DO C의 하위 디렉토리에 상주을 : \ 문서 및 설정. 로컬 파일은 로컬 PC에서 응용 프로그램을 실행할 수 있도록 기본적으로 "일시적으로"다운로드되고 응용 프로그램 실행은 게시 설정에 따라 배포 된 ClickOnce 서버에서 제어되므로 "깨끗한"설치 디렉토리가 없습니다. (업데이트, 버전 요구 사항 확인 등).


서버의 C : \ Documents & Settings 폴더에 액세스 할 수 없으므로 앱이 생성 한 파일에 액세스 할 수 없습니다. 특정 폴더에서 앱을 실행합니다. 앱이 게시되는 폴더입니다. 해당 폴더의 경로는 어떻게 얻습니까?
Tony_Henrich

아, 배포 URL이 필요합니다. 미안, 나는 그것을 전혀 얻지 못했습니다. ClickOnce 응용 프로그램 내부 또는 외부 응용 프로그램에서 가져 오려고합니까?
RobinDotNet

1

clickonce 응용 프로그램의 배포 된 폴더 위치를 얻을 수 있었고 비슷한 특정 시나리오를 위해 검색에서 본 곳에서는 언급되지 않은 것으로 나타났습니다.

  • clickonce 응용 프로그램은 회사 LAN 네트워크 폴더에 배포됩니다.
  • clickonce 애플리케이션이 온라인 또는 오프라인으로 사용 가능하도록 설정되어 있습니다.
  • 내 프로젝트 속성의 clickonce 설치 URL 및 업데이트 URL에 아무것도 지정되지 않았습니다. 즉, 설치 또는 업데이트를위한 별도의 위치가 없습니다.
  • 내 게시 옵션에서 clickonce 응용 프로그램에 대한 바탕 화면 바로 가기가 만들어졌습니다.
  • 시작할 때 경로를 얻으려는 폴더는 경로를 하드 코딩하지 않고 응용 프로그램의 DEV, INT 및 PROD 버전에서 액세스하려는 폴더입니다.

내 유스 케이스의 시각적 내용은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

  • 파란색 상자의 폴더는 각 환경의 응용 프로그램에 대한 내 디렉토리 위치입니다.
  • 빨간색 박스형 폴더는 경로를 가져 오려는 디렉토리입니다 (먼저 OP와 동일한 앱의 배포 된 폴더 위치 "MyClickOnceGreatApp_1_0_0_37"을 가져와야 함).

clickonce 응용 프로그램이 배포 된 폴더를 반환하는 데 도움이되는이 질문이나 의견에 대한 제안을 찾지 못했습니다 (이 폴더를 기준으로 이동하여 관심있는 폴더를 찾습니다). 다른 인터넷 검색이나 관련 SO 질문도 답을 얻지 못했습니다.

제안 된 모든 속성이 개체 (예 : ActivationUri)가 null로 인해 실패했거나 로컬 PC의 캐시 된 설치된 앱 폴더를 가리키고있었습니다. 예, IsNetworkDeployed를 검사하여 null 개체를 정상적으로 처리 할 수 ​​있습니다. 문제는 아니지만 놀랍게도 IsNetworkDeployed는 실제로 clickonce 응용 프로그램에 대한 네트워크 배포 폴더 위치가 있지만 false를 반환합니다. 응용 프로그램이 캐시 된 로컬 비트에서 실행 중이기 때문입니다.

해결책은 다음을 보는 것입니다.

  • AppDomain.CurrentDomain.BaseDirectory 내가 개발하면서 응용 프로그램이 Visual Studio 내에서 실행될 때
  • System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation 정상적으로 실행될 때.

System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation모든 경우에 clickonce 응용 프로그램이 배포 된 네트워크 디렉토리를 올바르게 반환합니다. 즉, 다음을 통해 시작될 때 :

  • setup.exe
  • MyClickOnceGreatApp.application
  • 응용 프로그램을 처음 설치하고 시작할 때 생성되는 바탕 화면 바로 가기입니다.

응용 프로그램 시작시 WorkAccounts 폴더의 경로를 얻기 위해 사용하는 코드는 다음과 같습니다. 배포 된 응용 프로그램 폴더를 가져 오는 것은 부모 디렉토리까지 행하지 않기 때문에 간단합니다.

string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
    directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
    try
    {
        string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
        path = path.Replace("file:", "");
        path = path.Replace("/", "\\");
        directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
    }
    catch (Exception ex)
    {
        directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
    }
}

0

ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) 응용 프로그램을 사용자의 PC에 설치 한 후 응용 프로그램 폴더의 파일에 액세스하는 것이 문제라고 가정하면 응용 프로그램 자체에서이 폴더를 가져 오는 세 가지 방법입니다.

String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();    
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.

VS IDE 및 배포 / 설치된 ClickedOnce 앱에서 작동하며 "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed"확인이 필요하지 않습니다. ClickOnce는 Visual Studio 2017 프로젝트에 포함 된 모든 파일을 선택하므로 실제로 응용 프로그램은 응용 프로그램 내에서 상대 경로를 사용하여 배포 된 모든 파일에 액세스 할 수 있습니다.

이것은 Windows 10 및 Visual Studio 2017을 기반으로합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.