如何获取ClickOnce应用程序的文件夹路径

Ton*_*ich 157 .net windows clickonce

我需要在控制台ClickOnce .application(可执行文件)所在的同一文件夹中编写一个文件.它启动的文件夹.

我尝试使用Application.StartupPath&Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 但路径指向下的子文件夹c:\Documents & Settings.我如何获得.application居住的路径?

Eri*_*ngs 244

要查找文件夹位置,您只需运行应用程序,打开任务管理器(CTRL-SHIFT-ESC),选择应用程序并右键单击|打开文件位置.

  • @Jalal用于"老式机器",请访问www.SysInternals.com并下载Process Explorer.我怀疑Win7的TaskManager和Win8的更改只是从它复制. (5认同)
  • 嘿,亲小费!但它不适用于旧的糟糕的XP机器.:) (2认同)
  • 如果由于无法运行该应用程序而删除了我急需的日志文件,该怎么办? (2认同)
  • @Tony_Henrich你应该把它标记为正确的答案 (2认同)
  • @TomášZato 如果您的应用程序在启动时不断崩溃。您可能可以在事件查看器上找到有关崩溃的信息。查看“Windows 日志 > 应用程序”下,从列表视图中查找“应用程序错误”的源类型。已安装的应用程序路径很可能会在“常规”选项卡下显示为“故障应用程序路径”。 (2认同)

Rob*_*Net 118

path指向c:\ Documents&Settings下的子文件夹

那就对了.ClickOnce applications安装在安装它们的用户的配置文件下.您是否采取了从执行程序集中检索信息的路径,然后检查出来?

在Windows Vista和Windows 7上,您可以在此处找到ClickOnce缓存:

c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername
Run Code Online (Sandbox Code Playgroud)

在Windows XP上,您可以在此处找到它:

C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername
Run Code Online (Sandbox Code Playgroud)

  • 我明白这一切。我想要我点击应用程序的文件夹。我无权访问 C:\Documents and Settings 因此,如果我要使用该函数返回的文件夹路径并且我不想使用硬编码路径值,我将无权访问日志文件. (2认同)

Sim*_*ver 24

ApplicationDeployment.CurrentDeployment.ActivationUri可能会起作用

"如果部署清单中的TrustUrlParameters属性为false,或者用户已提供UNC以打开部署或已在本地打开它,则为零长度字符串.否则,返回值是用于启动应用程序的完整URL,包括任何参数."


但我认为你真正想要的是ApplicationDeployment.CurrentDeployment.DataDirectory,它为你提供了一个可以写入数据的文件夹.无论如何,当您更新应用程序时,您将丢失原始.exe文件夹中的内容,但您可以将数据目录迁移到该应用程序的新版本.您的应用程序可以使用它具有的任何日志文件写入此文件夹 - 我很确定它保证可写.


use*_*954 13

我正在使用.Net 4.5.1中的Assembly.GetExecutingAssembly().LocationClickOnce部署应用程序的路径.

但是,您不应该写入任何部署应用程序的文件夹,无论部署方法如何(xcopy,ClickOnce,InstallShield,任何内容),因为这些文件通常只读取应用程序,特别是在较新的Windows版本和服务器环境中.

应用程序必须始终写入为此目的保留的文件夹.您可以从Environment.SpecialFolder枚举开始获取所需的文件夹.MSDN页面解释了每个文件夹的用途:http: //msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx

即数据,日志和其他文件可以使用ApplicationData(漫游),LocalApplicationData(本地)或CommonApplicationData.对于临时文件使用Path.GetTempPathPath.GetTempFileName.

以上在服务器和台式机上的工作也是如此.

编辑: Assembly.GetExecutingAssembly()在主可执行文件中调用.


Fra*_*erZ 5

经过详尽的搜索之后,我终于找到了一种通过注册表找到混淆的文件夹名称的方法。这是一种获取它们的简单方法:

private static Tuple<string, string> GetClickonceDirectories()
{
    var appToken  = (string) Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0", "ComponentStore_RandomString", null);
    var dataToken = (string) Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\StateManager", "StateStore_RandomString", null);

    if (string.IsNullOrWhiteSpace(appToken) || string.IsNullOrWhiteSpace(dataToken))
    {
        throw new Exception("Unable to find clickonce directories.");
    }

    var appDir =
            $@"{appToken.Substring(0, 8)}.{appToken.Substring(8, 3)}\{appToken.Substring(11, 8)}.{appToken.Substring(19, 3)}";

    var dataDir = 
            $@"Data\{dataToken.Substring(0, 8)}.{dataToken.Substring(8, 3)}\{dataToken.Substring(11, 8)}.{dataToken.Substring(19, 3)}";

    var rootPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
    rootPath = Path.Combine(rootPath, "Apps", "2.0");

    return new Tuple<string, string>(Path.Combine(rootPath, appDir), Path.Combine(rootPath, dataDir));
}
Run Code Online (Sandbox Code Playgroud)


Neb*_*oft 3

ClickOnce 应用程序确实驻留在 C:\Documents & Settings 的子目录中。它们没有“干净”的安装目录,因为本地文件本质上是“临时”下载的,以允许应用程序在本地 PC 上运行,并且应用程序的执行由部署在其上的 ClickOnce 服务器控制,具体取决于发布设置(检查更新、版本要求等)。