我需要在控制台 ClickOnce .application(可执行文件)所在的同一文件夹中写入一个文件。从中启动的文件夹。
.application
我试着用 Application.StartupPath和 Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) 但是路径指向 c:\Documents & Settings下的一个子文件夹。如何得到 .application所在的路径?
Application.StartupPath
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
c:\Documents & Settings
ClickOnce 应用程序 好的位于 C: Document & Settings 的子目录中。它们没有“干净”的安装目录,因为本地文件基本上是“临时”下载的,以允许应用程序在本地 PC 上运行,应用程序的执行是由 ClickOnce 服务器控制的,根据发布设置(检查更新,版本要求等) ,它们被部署。
路径指向 c: Document & Settings 下的子文件夹
没错。ClickOnce applications安装在安装它们的用户的配置文件下。您是否选择了从正在执行的程序集中检索信息的路径,并去检查它?
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
ApplicationDeployment. CurrentDeployment. ActivationUri 可能有效
”如果部署清单中的 TrustUrlParameter 属性为 false,或者如果用户已提供 UNC 以打开部署或已在本地打开该部署,则为零长度字符串。否则,返回值就是用于启动应用程序的完整 URL,包括任何参数。”
但我认为你真正想要的是 ApplicationDeployment。 CurrentDeployment。 DataDirectory,它给你一个文件夹,你可以写数据。无论如何,当您更新应用程序时,您将丢失原来的内容。Exe 文件夹,但是您可以将数据目录迁移到新版本的应用程序。您的应用程序可以写到这个文件夹与任何日志文件,它有-我非常肯定它保证是可写的。
要找到文件夹的位置,你只需运行应用程序,打开任务管理器(CTRL-SHIFT-ESC) ,选择应用程序,然后右击 | 打开文件位置。
我使用 Assembly.GetExecutingAssembly().Location获取到.Net 4.5.1中部署的 ClickOnce应用程序的路径。
Assembly.GetExecutingAssembly().Location
ClickOnce
但是,不管部署方法是什么(xcopy、 ClickOnce、 InstallShield 等等) ,你都不应该写入应用程序部署到的任何文件夹,因为这些文件通常只对应用程序进行读取,特别是在较新的 Windows 版本和服务器环境中。
应用程序必须始终写入为此目的保留的文件夹。您可以从 Environment 开始获取所需的文件夹。SpecialFolder 枚举。MSDN 页面解释了每个文件夹的用途: Http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
例如,对于数据、日志和其他文件,可以使用 ApplicationData(漫游)、 LocalApplicationData(本地)或 CommonApplicationData。 对于临时文件,使用 Path.GetTempPath或 Path.GetTempFileName。
ApplicationData
LocalApplicationData
CommonApplicationData
Path.GetTempPath
Path.GetTempFileName
以上工作也适用于服务器和台式机。
编辑: 在主可执行文件中调用 Assembly.GetExecutingAssembly()。
Assembly.GetExecutingAssembly()
下面是我发现的能够获得我的点击一次应用程序的已部署文件夹位置的方法,这在我的搜索中没有提到,对于我类似的,特定的场景:
下面是我的用例的视图:
我没有发现这个问题中的任何建议或者他们的评论在返回 Clickonce 应用程序所部署的文件夹中起作用(然后我将相对于这个文件夹移动以找到感兴趣的文件夹)。也没有其他互联网搜索或相关的 SO 问题找到答案。
所有建议的属性要么由于对象(例如 ActivationUri)为 null 而失败,要么指向本地 PC 的缓存安装的应用程序文件夹。是的,我可以通过检查 IsNetworkDeployed 来优雅地处理 null 对象——这不是问题——但令人惊讶的是,IsNetworkDeployed 返回 false,尽管事实上我有一个网络部署的文件夹位置,用于 clickonce 应用程序。这是因为应用程序是从本地缓存位运行的。
解决办法是:
AppDomain.CurrentDomain.BaseDirectory
在所有情况下,System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation都正确地返回我的 clickonce 应用程序部署到的网络目录。也就是说,当它通过以下途径发射时:
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
下面是我在应用程序启动时用来获取 WorkAccount 文件夹路径的代码。获取已部署的应用程序文件夹非常简单,只需不直接进入父目录即可:
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(); } }
假设问题是关于在 ClickOnce (true = = System)之后访问应用程序文件夹中的文件。部署。ApplicationDeploy.IsNetworkDeployed)应用程序安装在用户的个人电脑上,有三种方法可以通过应用程序本身获得这个文件夹:
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”。部署。“ ApplicationDeploy.IsNetworkDeployed”检查是必需的。ClickOnce 获取 VisualStudio2017项目中包含的任何文件,因此应用程序实际上可以使用应用程序内部的相对路径访问任何和所有部署的文件。
这是基于 Windows10和 VisualStudio2017的