Путь данных приложения во время разработки или развертывания

У меня есть старое приложение Windows Forms .Net, которое в Windows XP было "развернуто" путем копирования всех файлов в папку приложения.

Теперь я планирую развернуть на более новых ОС Windows, используя либо InstallShield, либо Advanced Installer, и буду помещать dll в папку установки приложения, а файлы содержимого в ProgramData и / или в AppData пользователя.

Таким образом, файлы содержимого будут находиться в одном месте во время отладки в Visual Studio 2010 (возможно, просто храните их там, где они сейчас находятся, в папке bin/debug приложения) и в другом месте при развертывании.

Как заставить доступ к этим файлам работать так же, как во время отладки Visual Studio, так и во время развертывания?

Если бы у меня была глобальная строка, содержащая базовый путь для файлов содержимого, я мог бы получить доступ к файлам с помощью пути относительно этой строки. Но я не уверен, как создать строку, которая имеет правильный путь во время отладки, а затем другой путь во время развертывания.

Я знаю, что могу тестировать флаги Debug vs Release, но это не совсем то же самое. (переход на сборку релиза просто перемещает файлы в../bin/Release вместо../bin/Debug; возможно, все еще не развернут.)

Есть ли простой пример того, как это сделать?

Чтобы было ясно, я не спрашиваю о деталях доступа к пути относительно базового каталога. Я спрашиваю, как провести различие между запущенным и запущенным во время разработки.

Поэтому знание того, как определить "я развернут", - это минимальная помощь, в которой я нуждаюсь. Еще лучше будет мини-пример или ссылка на учебник, который показывает доступ к файлам содержимого в одном месте во время разработки и в другом месте при развертывании.


ОБНОВИТЬ

Каков наилучший способ в C# определить, работает ли программист с помощью IDE или пользователь? охватывает самый важный случай, поэтому я бы использовал его, если бы не было другого решения. Однако он не будет работать правильно, если разработчик дважды щелкнет непосредственно по файлу.exe в папке bin/debug проекта разработки. Потому что они не работают в IDE (и мы не используем vshost.exe), но базовая папка такая же, как если бы они были.

ОБНОВИТЬ

При дальнейшем рассмотрении предложенные выше вопросы и ответы о переполнении стека совсем не одно и то же. Мне все равно, подключен ли отладчик (можно было бы прикрепить отладчик к установленной / развернутой версии, и это все равно будет развернутая версия, а не версия для разработки).

Я изначально думал, что где-то может быть какой-то стандартный флаг или параметр конфигурации, который приложение может использовать для определения того, что оно установлено.

Как люди узнают, где искать свои файлы содержимого, учитывая, что они не будут находиться в одном месте во время разработки по сравнению с установкой? (Если только вы не применили "старый подход" к размещению файлов содержимого в папке установки вашего приложения. Это то, что я делал раньше, но теперь нужно сделать по-другому.)


ОБНОВИТЬ

Наконец, было прозрение, что я не должен пытаться хранить файлы содержимого в папке bin/debug во время разработки - делал это только потому, что так было раньше. Не решили, следует ли переместить их всех в место, где они будут находиться после развертывания, или в другое место на машинах разработки.

Мне все еще любопытно, как другие люди определяют местоположение файлов содержимого во время разработки, но, возможно, это другой вопрос...

1 ответ

Решение

Я решил это путем явного поиска файла в двух возможных местах. Затем кэшируем путь к каталогу для доступа к будущему контенту. В моем случае расположение "разработка" - это папка "содержимое", которая находится рядом с папкой "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
Другие вопросы по тегам