#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