Запись My.Settings в текстовый файл

#vb.net #visual-studio-2013 #streamwriter #my.settings

#vb.net #visual-studio-2013 #streamwriter #my.settings

Вопрос:

Хорошо, итак, у меня возникли некоторые проблемы с записью в текстовый файл, извлечением значений из My.Settings. Код приведен ниже. Проблема в том, что когда я проверяю текстовый файл, в нем есть только первая строка (которая является простой строкой в коде).

 Dim settingsfile As String = Directory.GetCurrentDirectory amp; "RapidSend_Settings.txt"
Dim objWriter As New System.IO.StreamWriter(settingsfile, False)
objWriter.WriteLine("This is the introductory line")
For Each strEmail As String In My.Settings.User_Emails 'Specialized.StringCollection
    objWriter.WriteLine("Email " amp; strEmail)
Next
For Each strHostName As String In My.Settings.User_HostName ' Specialized.StringCollection
    objWriter.WriteLine("Host " amp; strHostName)
Next
objWriter.WriteLine("End Of File")
objWriter.Close()
  

Вот как выглядит текстовый файл после кода:

  This is the introductory line
 End Of File
  

Мой вопрос в том, знает ли кто-нибудь, в чем проблема, или есть другой способ сделать это.
Кстати, все My.Settings являются специализированными.StringCollection, поэтому они содержат много строк.

Комментарии:

1. установите точку останова в начале и посмотрите, сколько элементов в коллекции. код должен работать, если там есть элементы. Однако при развертывании у вас, скорее всего, не будет доступа на запись GetCurrentDirectory , и в результате возникнет исключение. Лучше записывать в Users... папку.

2. Что вы имеете в виду под точкой останова? Я пробовал If My.Settings.User_Emails.Count = 0 Then MsgBox("Empty Collection") Else [WRITE TO FILE] End If , и это все еще не работает. И у меня действительно есть доступ. Спасибо

3.msdn.microsoft.com/en-us/library/vstudio /… они являются большой, очень большой частью отладочного кода. … и у вас, вероятно, не будет доступа к CurrentDirectory при развертывании

4. Я не получаю никаких ошибок. Я добавил текстовые сообщения, чтобы указать, где находится код, и он проходит через все. Я даже добавил ‘MsgBox (strEmail)’ в цикл For, и он показывает мне каждую строку, но он просто не записывает в текстовый файл.

5. использование коллекции в MySettings, вероятно, тоже не идеально, поскольку вы используете ее не по назначению. могут возникнуть проблемы с версиями и соотношением содержимого по умолчанию и текущего содержимого. Используйте emails As New List(Of String) вместо этого. вы добавляете и повторяете его так же, как эту коллекцию, но это будет ваш контейнер, а не контейнер VB / VS / NET

Ответ №1:

Поскольку вы больше не используете настройки так, как это было задумано, вам лучше создать свой собственный контейнер и управлять им самостоятельно:

  • Добавьте модуль в свое приложение, если его нет
  • Добавить Friend settingsList As New List(Of String) к нему

Это создаст глобальную коллекцию строк, в которые вы можете добавить свои данные. Он может быть общедоступным или дружественным. Есть и другие способы сделать это, но этот самый простой. Создайте его и для хостов.

Добавить к ним просто:

 settingsList.Add(some_STRING_variable)
  

Затем для сохранения при завершении работы приложения:

 ' get file name to hold the data
Dim file As String
file = System.IO.Path.Combine(Environment.GetFolderPath( _
       Environment.SpecialFolder.ApplicationData),  "myproduct", "settings.txt")
' result will be UsersAppdata.... where data is supposed to go

' open a stream
Using fs As New IO.StreamWriter(file, IO.FileMode.CreateNew)
    Dim n As Integer = 1
    ' loop thru List contents
    For Each s As String In settingsList
        ' ToDo: edit format to fit your needs
        fs.WriteLine(String.Format("{0} = {1}", n.ToString, s))
        n  = 1
    Next

End Using         ' close and properly dispose of stream