开发与部署期间的应用数据路径

时间:2015-05-28 00:01:27

标签: .net winforms visual-studio-2010 deployment file-access

我有一个旧的Windows Forms .Net应用程序,它在Windows XP上通过将所有文件复制到应用程序文件夹来“部署”。

现在我计划使用InstallShield或Advanced Installer部署到更新的Windows操作系统,并将dll放在app install文件夹中,将内容文件放在ProgramData和/或用户的AppData中。

因此,在Visual Studio 2010中调试期间内容文件将位于一个位置(可能只是将它们保留在应用程序的bin / debug文件夹中),以及部署时的另一个位置。

在Visual Studio调试期间,如何在部署期间如何以相同的方式访问这些文件?

如果我有一个包含内容文件基本路径的全局字符串,那么我可以使用相对于该字符串的路径访问这些文件。但我不确定如何在调试期间创建具有正确路径的字符串,然后在部署期间创建不同的路径。

我知道我可以测试Debug vs Release标志,但这不是完全相同的事情。 (切换到发布版本只是将文件移动到../bin/Release而不是../bin/Debug;可能仍然没有部署。)

是否有一个如何实现此目的的简单示例?

要清楚,我不是在询问访问相对于基目录的路径的详细信息。我问如何区分在开发期间运行已部署和运行。

因此,知道如何检测“我已部署”是我需要的最低帮助。更好的是一个迷你示例或教程链接,显示在开发期间访问一个位置的内容文件,以及部署时的不同位置。

更新

What is the best way in c# to determine whether the programmer is running the program via IDE or it's user? 涵盖了最重要的案例,如果没有其他解决方案,我会使用它。但是,如果开发人员直接双击开发项目的bin / debug文件夹中的.exe,则它无法正常工作。因为它们不在IDE中运行(我们也不使用vshost.exe),但基本文件夹与它们相同。

更新

经过进一步反思,上面提出的堆栈溢出Q& A根本不是一回事。我不关心是否附加调试器(可以将调试器附加到已安装/部署的版本,它仍然是部署版本,而不是开发版本。)

我原本以为应用程序可以使用某些标准的标记或配置设置来确定它已安装。

人们如何知道在哪里查找他们的内容文件,因为他们在开发期间不会安装在同一个地方而不是安装? (除非你采用“旧学校”的方法将内容文件放入你的应用安装文件夹。这是我之前所拥有的,但现在需要采用不同的方式。)

更新

最后有一个顿悟,我不应该试图在开发过程中将内容文件保存在bin / debug文件夹中 - 只是这样做,因为它就是以前的样子。尚未决定是将它们全部移动到部署后的位置,还是移动到开发机器上的其他位置。

我仍然很好奇其他人如何在开发过程中指定内容文件的位置,但也许这是一个不同的问题......

1 个答案:

答案 0 :(得分:0)

我通过在两个可能的位置显式查找文件来解决这个问题。然后缓存目录路径以供将来内容访问。就我而言,“开发”位置是“内容”文件夹,它位于“bin”文件夹旁边。

' Language: Visual Basic (VB)
' ... this is inside a VB module ...
Public g_AppRelativePath As String = "CompanyName\AppName"
Private _contentPathRootWithSlash As String

Public Function ContentPath(relPath As String) As String
  If _contentPathRootWithSlash Is Nothing Then
    ' --- first try to find "development" content ---
    ' Folder containing .exe.
    Dim pathRoot As String = Application.StartupPath
    Dim binIndex As Integer = pathRoot.LastIndexOf("bin", StringComparison.Ordinal)
    If binIndex >= 0 Then
      ' "content" folder that has been prepared as a sibling of "bin".
      pathRoot = pathRoot.Remove(binIndex) & "content"
    End If
    Dim pathRootWithSlash As String = pathRoot & "\"

    If File.Exists(pathRootWithSlash & relPath) Then
      _contentPathRootWithSlash = pathRootWithSlash

    Else
      ' --- "development" content does not exist; look for "deployed" content. ---
      '' Use this, if want files to be in User's AppData\Roaming.
      'pathRootWithSlash = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\"
      ' Use this, if want files to be shared by all users, in ProgramData.
      pathRootWithSlash = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) & "\"
      ' g_AppRelativePath was previously set to "CompanyName\AppName", which matches logic in our installer.
      pathRootWithSlash = pathRootWithSlash & g_AppRelativePath & "\"
      If File.Exists(pathRootWithSlash & relPath) Then
        _contentPathRootWithSlash = pathRootWithSlash

      Else
        ' Failed to find.
        MsgBox(String.Format("Can't find content file ""{0}""", relPath))
        Return Nothing
      End If
    End If
  End If

  Return _contentPathRootWithSlash & relPath
End Function