Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Editar un archivo de texto plano a través de un formulario

Estas en el tema de Editar un archivo de texto plano a través de un formulario en el foro de .NET en Foros del Web. Hola, estoy haciendo un programa que debe poder editar el archivo server.properties que usan los servidores de Minecraft. #Minecraft server properties #Thu Aug 15 18:05:39 ...
  #1 (permalink)  
Antiguo 16/08/2013, 18:42
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 5 meses
Puntos: 2
Editar un archivo de texto plano a través de un formulario

Hola, estoy haciendo un programa que debe poder editar el archivo server.properties que usan los servidores de Minecraft.

#Minecraft server properties
#Thu Aug 15 18:05:39 CEST 2013
generator-settings=
allow-nether=true
level-name=world
enable-query=false
allow-flight=false
server-port=25565
level-type=DEFAULT
enable-rcon=false
force-gamemode=false
level-seed=
server-ip=
max-build-height=256
spawn-npcs=true
white-list=true
spawn-animals=true
texture-pack=
snooper-enabled=true
hardcore=false
online-mode=true
pvp=true
difficulty=1
enable-command-block=false
gamemode=0
max-players=20
spawn-monsters=true
view-distance=10
generate-structures=true
spawn-protection=16
motd=

Este es el contenido de esos archivos al abrirlos con el bloc de notas, y los valores deben aparecer representados en este formulario.

(Interfaz pendiente de mejorar mucho)

No creo que me cause ningún problema reescribir el archivo con los nuevos valores, pero el leerlo y poner cada valor en el sitio correspondiente...

Supongo que lo que necesito es un código capaz que buscar X fragmento del archivo de texto plano y asignarle a un string el resto de caracteres de la misma línea. Con eso me apañaría bastante bien.

¿Algún cable? los que os guste Minecraft y lleváis un servidor casero, reconoced que la idea de la aplicación promete :P
  #2 (permalink)  
Antiguo 20/08/2013, 00:28
 
Fecha de Ingreso: abril-2007
Mensajes: 163
Antigüedad: 17 años
Puntos: 2
Respuesta: Editar un archivo de texto plano a través de un formulario

Hola,
Buena idea. ¿Y ese programa no lo ofrece ya el propio minecraft?

En cualquier caso ahi va mi solución general. Te digo la idea, no el código.

1. Identificar patrón del TXT. Los pares clave/valor
allow-nether=true
level-name=world
enable-query=false
allow-flight=false

Y por lo que se ve es [CLAVE]=[VALOR]

2. Leer archivo linea a linea. Para cada linea hacer un split("="), de esta forma se obtiene la clave y el valor. Almacenar clave valor en un diccionario.

3. Las modificaciones de interfaz deben modificar el valor del diccionario.

4. Al guardar reescribe el fichero entero
__________________
http://literaturaprogramada.blogspot.com.es/
literaturapogramada.blogspot - Reflexiones mundanas sobre la programación
  #3 (permalink)  
Antiguo 20/08/2013, 09:15
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: Editar un archivo de texto plano a través de un formulario

Hola, gracias por responder.

Me temo que no, dentro del propio Minecraft sólo puedes crear servidores locales que no puedes configurar en absoluto, y luego los servidores de verdad, que son archivos .jar que se ejecutan con un lanzador .bat, desde luego no son tan fáciles y cómodos de configurar, gestionar, actualizar, etc, como pretendo que este programa haga.

En cuanto a la idea, voy a investigar sobre ese tal split que mencionas, y actualizo el mensaje en cuanto consiga algo.

Saludos!

Edito: He creado una aplicación de consola para hacer las pruebas, y he usado este código:

Código vb:
Ver original
  1. Imports System
  2. Imports System.IO
  3.  
  4. Module Module1
  5.     Private s As String
  6.     Sub Main()
  7.         Dim path As String = "server.properties"
  8.         Dim sw As StreamWriter
  9.         Dim readText() As String = File.ReadAllLines(path)
  10.         For Each s In readText
  11.             Dim split As String() = s.Split(New [Char]() {"="c, CChar(vbTab)})
  12.  
  13.             For Each s As String In split
  14.                 If s.Trim() <> "" Then
  15.                     Console.WriteLine(s)
  16.                 End If
  17.             Next s
  18.         Next
  19.         Console.ReadLine()
  20.     End Sub
  21. End Module

Este es el resultado:



Lo siguiente que debería hacer es lo que dices del diccionario, pero ni idea, ¿cómo funciona lo del diccionario? ¿cómo hago que distinga cuál es la clave y cuál el valor?

Edito 2: He encontrado esto sobre los diccionarios: http://msdn.microsoft.com/es-es/library/xfhwa508.aspx

Según lo que veo en el ejemplo, ¿debería crear entradas de dos strings por cada propiedad, en la que el primer string de cada entrada es el nombre de una propiedad? aún así sigo sin entender cómo puedo luego identificar una propiedad, y que si la siguiente palabra no es una propiedad, sino un valor, se lo asigne en el diccionario a la última propiedad que ha leído.

Edito 3: Creo que ya lo he solucionado, este es el código completo y captura de pantalla del resultado:

Código vb:
Ver original
  1. Imports System
  2. Imports System.IO
  3.  
  4. Module Module1
  5.     Private s As String
  6.     Private leyendopropiedad As String
  7.     Private Diccionario As New Dictionary(Of String, String)
  8.  
  9.     Sub Main()
  10.  
  11.         Diccionario.Add("generator-settings", "")
  12.         Diccionario.Add("allow-nether", "")
  13.         Diccionario.Add("level-name", "")
  14.         Diccionario.Add("enable-query", "")
  15.         Diccionario.Add("allow-flight", "")
  16.         Diccionario.Add("server-port", "")
  17.         Diccionario.Add("level-type", "")
  18.         Diccionario.Add("enable-rcon", "")
  19.         Diccionario.Add("force-gamemode", "")
  20.         Diccionario.Add("level-seed", "")
  21.         Diccionario.Add("server-ip", "")
  22.         Diccionario.Add("max-build-height", "")
  23.         Diccionario.Add("spawn-npcs", "")
  24.         Diccionario.Add("white-list", "")
  25.         Diccionario.Add("spawn-animals", "")
  26.         Diccionario.Add("texture-pack", "")
  27.         Diccionario.Add("snooper-enabled", "")
  28.         Diccionario.Add("hardcore", "")
  29.         Diccionario.Add("online-mode", "")
  30.         Diccionario.Add("pvp", "")
  31.         Diccionario.Add("difficulty", "")
  32.         Diccionario.Add("server-name", "")
  33.         Diccionario.Add("enable-command-block", "")
  34.         Diccionario.Add("gamemode", "")
  35.         Diccionario.Add("max-players", "")
  36.         Diccionario.Add("spawn-monsters", "")
  37.         Diccionario.Add("generate-structures", "")
  38.         Diccionario.Add("view-distance", "")
  39.         Diccionario.Add("spawn-protection", "")
  40.         Diccionario.Add("motd", "")
  41.  
  42.         Dim path As String = "server.properties"
  43.         Dim sw As StreamWriter
  44.         Dim readText() As String = File.ReadAllLines(path)
  45.         For Each s In readText
  46.             Dim split As String() = s.Split(New [Char]() {"="c})
  47.  
  48.             For Each s As String In split
  49.                 If s.Trim() <> "" Then
  50.                     If Not s.StartsWith("#") Then
  51.                         If Diccionario.ContainsKey(s) Then
  52.                             leyendopropiedad = s
  53.                         Else
  54.                             If Not Diccionario.ContainsKey(s) Then
  55.                                 Diccionario(leyendopropiedad) = s
  56.                                 Sub1()
  57.                             End If
  58.                         End If
  59.                     End If
  60.                 End If
  61.             Next s
  62.         Next
  63.  
  64.         Console.ReadLine()
  65.  
  66.             End Sub
  67.     Private Sub Sub1()
  68.         Dim value As String = ""
  69.         Dim key As String = leyendopropiedad
  70.         If Diccionario.TryGetValue(key, value) Then
  71.             Console.WriteLine("La propiedad " & """" & key & """" & ", está establecida en = {0}.", value)
  72.         Else
  73.            
  74.         End If
  75.     End Sub
  76. End Module



Ahora iré a por los pasos 3 y 4 :P

Última edición por vistaero; 20/08/2013 a las 12:43

Etiquetas: formulario, net, plano
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:36.