elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Ayuda escritura archivo en C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda escritura archivo en C#  (Leído 4,725 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Ayuda escritura archivo en C#
« en: 6 Mayo 2015, 09:49 am »

Hola a todos ustedes, miren estoy usando un archivo en el que guardo los datos de una aplicación todos sus datos (login, información, autentificacion, entradas, configuración...), cada tipo de datos está delimitado por una linea única en el archivo.

Cuando se realiza un cambio sobre algo por pequeño que sea debo sobreescribir el archivo. Antes trabajaba con un archivo para cada cosa, pero no era el camino correcto tener 10 archivos a la vez.

Es por ello que decidí meterlo en uno y poder lineas delimitadoras, que se crean de la siguiente manera, y se generan al llamar al constructor de archivo:

Código
  1. public Archivo(String directorio)
  2.        {
  3.            this.lectura = new FileStream(directorio + "\\app.dat", FileMode.Open);
  4.            this.escritura = new FileStream(directorio + "\\app.tmp", FileMode.Create);
  5.            vector.Add("ENTRADA_AUTH_SALIDA");//0
  6.            vector.Add("ENTRADA_LOGI_SALIDA");//1
  7.            vector.Add("ENTRADA_CALC_SALIDA");//2
  8.            vector.Add("ENTRADA_HOLA_SALIDA");//3
  9.            vector.Add("ENTRADA_MENS_SALIDA");//4
  10.            vector.Add("ENTRADA_ENTR_SALIDA");//5
  11.            vector.Add("ENTRADA_PARA_SALIDA");//6
  12.        }

Bien, ahora para sobreescribir el archivo llega mi duda. El archivo app.dat tiene los datos actuales, lo que pense era en leer todo su contenido y pasarlo a una cadena. Y sobreescibir esa cadena añadiendo los datos en el campo correspondiente y escribirla en otro archivo de salida.

Pero creo que es preferible utilizar solo un archivo ya puestos.

Es por ello que quiero leer el contenido del archivo, luego modificar la cadena leída y sobreescribirla en el mismo archivo. He probado esto:

Código
  1. public bool setAutentificacion(String certificado)
  2.        {
  3.            StreamWriter escritor = new StreamWriter(escritura);//intentar escritura sobremismo archivo
  4.            StreamReader lector = new StreamReader(lectura);
  5.            String contenido = lector.ReadToEnd();
  6.            lector.Close();
  7.            if(contenido.Contains(vector[0].ToString())
  8.            {
  9.                contenido.//aqui quiero saber el puntero de la cadena donde esta esa subcadena
  10.            }
  11. }

Podría hacerlo leyendo caracter a caracter hasta los \n o NewLine, pero tardaría mucho para archivos grandes. Además de la forma de hacerlo no me parece adecuada asi, no se si se podría hacer con algún metodo el identificar la subcadena y obtener el indice donde se encuentra para poder cortarla alli e introducir los nuevos datos.

Luego tengo también la duda del archivo, si puedo hacer de un FileStream un StreamReader y un StreamWriter a la vez, para leerlo todo con uno, y luego usar el otro para sobreescribir el mismo, no se si será posible.

Saludos y gracias por estar ahí de veras. Podéis contar conmigo.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda escritura archivo en C#
« Respuesta #1 en: 6 Mayo 2015, 11:14 am »

Hola

Perdon que te lo diga pero tengo la sensación de que nunca das la información necesaria, o al menos yo nunca soy capaz de entender a la perfección el problema que tienes en las dudas que formulas, espero haber entendido bien lo que pretendes hacer esta vez.

En realidad no necesitas ningún archivo "app.dat" ni manipular el contenido de ningún archivo manuálmente, ya que puedes utilizar la infrastructura settings para almacenar la configuración de usuario, dicha configuración se escribe en un archivo del directorio Roaming pero su manipulación es muy sencilla ya que está orientada a objetos:
Using Settings in C#

De todas formas, si quieres generar un archivo legible/editable entonces dale una extensión común de texto plano, cómo "app.txt" o "app.ini", pero si utilizas la extensión ".dat" eso da a entender al end-user que debería tratarse de un archivo binario con contenido "ilegible", y por ende te sugiero aplicar la serialización de datos:

Primero, diseño el modelo de un objeto/contenedor cómo esta estructura de abajo, que servirá para almacenar los datos:
Código
  1. ''' <summary>
  2. ''' Structure that specifies the application configuration.
  3. ''' </summary>
  4. <SerializableAttribute>
  5. Public Structure ConfigStruct
  6.  
  7.    ''' <summary>
  8.    ''' </summary>
  9.    Public Auth As String
  10.  
  11.    ''' <summary>
  12.    ''' </summary>
  13.    Public Logi As String
  14.  
  15.    ''' <summary>
  16.    ''' </summary>
  17.    Public Calc As String
  18.  
  19.    ''' <summary>
  20.    ''' </summary>
  21.    Public Hola As String
  22.  
  23.    ''' <summary>
  24.    ''' </summary>
  25.    Public Mens As String
  26.  
  27.    ''' <summary>
  28.    ''' </summary>
  29.    Public Entr As String
  30.  
  31.    ''' <summary>
  32.    ''' </summary>
  33.    Public Para As String
  34.  
  35. End Structure

C#:
Código
  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7.  
  8. /// <summary>
  9. /// Structure that specifies the application configuration.
  10. /// </summary>
  11. [SerializableAttribute()]
  12. public struct ConfigStruct
  13. {
  14. /// <summary>
  15. /// </summary>
  16. public string Auth;
  17.  
  18. /// <summary>
  19. /// </summary>
  20. public string Logi;
  21.  
  22. /// <summary>
  23. /// </summary>
  24. public string Calc;
  25.  
  26. /// <summary>
  27. /// </summary>
  28. public string Hola;
  29.  
  30. /// <summary>
  31. /// </summary>
  32. public string Mens;
  33.  
  34. /// <summary>
  35. /// </summary>
  36. public string Entr;
  37.  
  38. /// <summary>
  39. /// </summary>
  40. public string Para;
  41. }
  42.  
  43. //=======================================================
  44. //Service provided by Telerik (www.telerik.com)
  45. //=======================================================

Segundo, desarrollo los métodos (genéricos) de serialización y deserialización los cuales me ayudarán a automatizar dicha tarea:
Código
  1. Imports System.Runtime.Serialization.Formatters.Binary
  2.  
  3. ''' <summary>
  4. ''' Exposes members for binary serialization.
  5. ''' </summary>
  6. Public NotInheritable Class BinarySerializerUtil
  7.  
  8.    ''' <summary>
  9.    ''' Serializes an object into the specified file, using binary serialization.
  10.    ''' </summary>
  11.    ''' <typeparam name="T"></typeparam>
  12.    ''' <param name="object">The object to serialize.</param>
  13.    ''' <param name="filepath">The filepath to save the obstore the serialized data.</param>
  14.    Public Shared Sub Serialize(Of T)(ByVal [object] As T,
  15.                                      ByVal filepath As String)
  16.  
  17.        Dim serializer As New BinaryFormatter
  18.  
  19.        Using writer As New FileStream(filepath, FileMode.Create)
  20.            serializer.Serialize(writer, [object])
  21.        End Using
  22.  
  23.    End Sub
  24.  
  25.    ''' <summary>
  26.    ''' Deserializes an Object from the specified file, using binary deserialization.
  27.    ''' </summary>
  28.    ''' <typeparam name="T"></typeparam>
  29.    ''' <param name="object">The ByRefered object to store the deserialized data.</param>
  30.    ''' <param name="filepath">The filepath to deserialize its contents.</param>
  31.    Public Shared Sub Deserialize(Of T)(ByRef [object] As T,
  32.                                        ByVal filepath As String)
  33.  
  34.        Dim serializer As New BinaryFormatter
  35.  
  36.        Using reader As New FileStream(filepath, FileMode.Open)
  37.            [object] = DirectCast(serializer.Deserialize(reader), T)
  38.        End Using
  39.  
  40.    End Sub
  41.  
  42. End Class

C#:
Código
  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7. using System.Runtime.Serialization.Formatters.Binary;
  8.  
  9. /// <summary>
  10. /// Exposes members for binary serialization.
  11. /// </summary>
  12. public sealed class BinarySerializerUtil
  13. {
  14. /// <summary>
  15. /// Serializes an object into the specified file, using binary serialization.
  16. /// </summary>
  17. /// <typeparam name="T"></typeparam>
  18. /// <param name="object">The object to serialize.</param>
  19. /// <param name="filepath">The filepath to save the obstore the serialized data.</param>
  20. public static void Serialize<T>(T @object, string filepath)
  21. {
  22. BinaryFormatter serializer = new BinaryFormatter();
  23.  
  24. using (FileStream writer = new FileStream(filepath, FileMode.Create)) {
  25. serializer.Serialize(writer, @object);
  26. }
  27. }
  28.  
  29. /// <summary>
  30. /// Deserializes an Object from the specified file, using binary deserialization.
  31. /// </summary>
  32. /// <typeparam name="T"></typeparam>
  33. /// <param name="object">The ByRefered object to store the deserialized data.</param>
  34. /// <param name="filepath">The filepath to deserialize its contents.</param>
  35. public static void Deserialize<T>(ref T @object, string filepath)
  36. {
  37. BinaryFormatter serializer = new BinaryFormatter();
  38.  
  39. using (FileStream reader = new FileStream(filepath, FileMode.Open)) {
  40. @object = (T)serializer.Deserialize(reader);
  41. }
  42. }
  43. }
  44.  
  45. //=======================================================
  46. //Service provided by Telerik (www.telerik.com)
  47. //=======================================================

Por último, lo pongo todo en práctica.
(Si lo necesitases puedes adaptar el ejemplo para serializar también una colección uni o multi dimensional, claro está, aunque dependiendo del tipo de objeto la implementación de una serialización puede requerir más trabajo):
Código
  1. Imports System.IO
  2.  
  3. Public Class Form1
  4.  
  5.    ''' <summary>
  6.    ''' The filepath where to serialize de data.
  7.    ''' </summary>
  8.    Private ReadOnly datFilePath As String = Path.Combine(Application.StartupPath, "app.dat")
  9.  
  10.    ''' <summary>
  11.    ''' A <see cref="ConfigStruct"/> instance that specifies the application config.
  12.    ''' </summary>
  13.    Private config As New ConfigStruct With
  14.        {
  15.            .Auth = "Auth value",
  16.            .Calc = "Calc vaule",
  17.            .Entr = "Entr vaule",
  18.            .Hola = "Hola vaule",
  19.            .Logi = "Logi vaule",
  20.            .Mens = "Mens vaule",
  21.            .Para = "Para vaule"
  22.        }
  23.  
  24.    ''' <summary>
  25.    ''' Handles the <see cref="Form.Shown"/> event of this form.
  26.    ''' </summary>
  27.    Private Sub Test() Handles MyBase.Shown
  28.  
  29.        ' Serializo los datos de la instancia del objeto, al archivo especificado.
  30.        BinarySerializerUtil.Serialize(Of ConfigStruct)(Me.config, datFilePath)
  31.  
  32.        ' Limpio los datos del objeto.
  33.        Me.config = Nothing
  34.  
  35.        ' Deserializo los datos del archivo, a la instancia del objeto especificado.
  36.        BinarySerializerUtil.Deserialize(Of ConfigStruct)(Me.config, datFilePath)
  37.  
  38.        Debug.WriteLine(Me.config.Auth)
  39.        Debug.WriteLine(Me.config.Calc)
  40.        Debug.WriteLine(Me.config.Entr)
  41.        Debug.WriteLine(Me.config.Hola)
  42.        Debug.WriteLine(Me.config.Logi)
  43.        Debug.WriteLine(Me.config.Mens)
  44.        Debug.WriteLine(Me.config.Para)
  45.  
  46.    End Sub
  47.  
  48. End Class

C#:
Código
  1. using Microsoft.VisualBasic;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Diagnostics;
  7. using System.IO;
  8.  
  9. public class Form1
  10. {
  11. /// <summary>
  12. /// The filepath where to serialize de data.
  13. /// </summary>
  14.  
  15. private readonly string datFilePath = Path.Combine(Application.StartupPath, "app.dat");
  16. /// <summary>
  17. /// A <see cref="ConfigStruct"/> instance that specifies the application config.
  18. /// </summary>
  19. private ConfigStruct config = new ConfigStruct {
  20. Auth = "Auth value",
  21. Calc = "Calc vaule",
  22. Entr = "Entr vaule",
  23. Hola = "Hola vaule",
  24. Logi = "Logi vaule",
  25. Mens = "Mens vaule",
  26. Para = "Para vaule"
  27. };
  28.  
  29. /// <summary>
  30. /// Handles the <see cref="Form.Shown"/> event of this form.
  31. /// </summary>
  32. private void Test()
  33. {
  34. // Serializo los datos de la instancia del objeto, al archivo especificado.
  35. BinarySerializerUtil.Serialize<ConfigStruct>(this.config, datFilePath);
  36.  
  37. // Limpio los datos del objeto.
  38. this.config = null;
  39.  
  40. // Deserializo los datos del archivo, a la instancia del objeto especificado.
  41. BinarySerializerUtil.Deserialize<ConfigStruct>(this.config, datFilePath);
  42.  
  43. Debug.WriteLine(this.config.Auth);
  44. Debug.WriteLine(this.config.Calc);
  45. Debug.WriteLine(this.config.Entr);
  46. Debug.WriteLine(this.config.Hola);
  47. Debug.WriteLine(this.config.Logi);
  48. Debug.WriteLine(this.config.Mens);
  49. Debug.WriteLine(this.config.Para);
  50.  
  51. }
  52.  
  53. public Form1()
  54. {
  55. Shown += Test;
  56. }
  57. }
  58.  
  59. //=======================================================
  60. //Service provided by Telerik (www.telerik.com)
  61. //=======================================================

No estoy seguro de si algo así es lo que pretendías hacer.

Saludos


« Última modificación: 6 Mayo 2015, 11:31 am por Eleкtro » En línea



Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Ayuda escritura archivo en C#
« Respuesta #2 en: 6 Mayo 2015, 11:56 am »

Hola elektro me ha parecido muy interesante tu respuesta. No sabía que se podía hacer eso, probaré a ver que tal se me da eso del settings, aunque no se si se podrá hacer para variables string muy largas, porque tengo pensado meter links de temas de foros en esas variables y pueden ser cientos de lineas incluso quizas miles. Es por eso que ahí ya dudo para eso, aunque para user/pas me parece mejor asi, la idea mia tambien era que si lo hago todo en un archivo encriptarlo todo.

Cuando vuelva con esto te comento, gracias.

Edito: Me costará comprenderlo, siempre hablas con un nivel experto y yo que soy un aprendiz me lleva tiempo analizar tus códigos, pero me ayudas mucho aun asi.

Aquí vuelvo, la idea tuya es bastante buena pero ya te dije que trabajo con cadenas muy largas y prefiero crear un archivo con toda la información y encriptarlo.

Tengo esto:

Código
  1. public bool setAutentificacion(String certificado)
  2.        {
  3.            int index;
  4.            bool correcto = false;;
  5.            StreamWriter escritor = new StreamWriter(escritura);//intentar escritura sobremismo archivo
  6.            StreamReader lector = new StreamReader(lectura);
  7.            String contenido = lector.ReadToEnd();
  8.            lector.Close();
  9.            if (contenido.Contains(vector[0].ToString()))
  10.            {
  11.                index = contenido.IndexOf(vector[0].ToString());
  12.                if (index != -1)
  13.                {
  14.                    correcto = true;
  15.                    contenido = contenido.Insert(contenido.IndexOf(vector[0].ToString()), certificado);
  16.                    int entrada = contenido.LastIndexOf(vector[0].ToString()+certificado);
  17.                    int salida = contenido.IndexOf(vector[1].ToString());
  18.                    contenido.Remove(entrada, salida-entrada);
  19.                    escritor.Write(contenido);
  20.                }
  21.                else
  22.                {
  23.                    correcto = false;
  24.                }
  25.            }
  26.            else
  27.                correcto = false;
  28.            return correcto;
  29.        }

Ahí ando, aunque como alguien toque el archivo adios, aunque pondre algo para comprobar si esta corrupto y que genere uno nuevo y ya esta, aunque sera dificil.

Me parece buena manera con los indexof() imaginaba que ahi estaria la clave ahora que se usarlos ya veo que es buen camino para identifica lugares intracatenarios.

Por cierto, no entiendo porque esto:

Código
  1. contenido.LastIndexOf(vector[0].ToString())

Vale cero cuando la cadena contenido contiene:

Citar
ENTRADA_AUTH_SALIDA
ENTRADA_LOGI_SALIDA
ENTRADA_CALC_SALIDA
ENTRADA_HOLA_SALIDA
ENTRADA_MENS_SALIDA
ENTRADA_ENTR_SALIDA
ENTRADA_PARA_SALIDA
« Última modificación: 6 Mayo 2015, 13:15 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda escritura archivo en C#
« Respuesta #3 en: 6 Mayo 2015, 13:33 pm »

no se si se podrá hacer para variables string muy largas, tengo pensado meter links de temas de foros en esas variables y pueden ser cientos de lineas incluso quizas miles.

El límite teórico de longitud para un String es el equivalente a 'Int32.MaxValue', es decir, 2.147,483,647 de caracteres, pero ya que por defecto .Net utiliza 2 bytes por caracter, el límite sería 1.073,741,823 de caracteres.

Mientras esas variables no superen el límite de longitud, o no superen los 2GB de asignación memoria, entonces no te preocupes ...hay potencia de sobra xD.



pueden ser cientos de lineas incluso quizas miles.

Por lo que comentas tienes un String que tiene una url por cada linea ...y son miles de lineas,
está claro que irás añadiendo urls a ese String, lo que no tengo claro es si también necesitas manipular constantemente ese string para buscar, eliminar o modificar alguna url, pero si llegas a necesitar eso entonces, ¿has pensado en utilizar una colección genérica de tipo List? (List<T>):

La Class List expone varios miembros que te facilitarían todas esas tareas y más (Add, AddRange, Remove, RemoveRange, RemoveAt, RemoveAll, Insert, IndexOf, Find, FindAll, FindIndex, etc...), me parece mucho más productivo que estar partiendo el String para buscar, eliminar o modificar urls, aunque siempre puedes hacerlo también bonito usando LINQ xD.



la idea mia tambien era que si lo hago todo en un archivo encriptarlo todo.

Perfecto, mi ejemplo entonces no ha sido en vano xD por que la serialización binaria le daría una seguridad adicional de ingeniería inversa, ten en cuenta que siempre puedes cifrar el string antes de serializarlo, y desenctriptarlo al deserializar. (al igual que si prefieres usar las settings).

Ah, y también puedes utilizar otro tipo de serializaciones para estructurar el archivo de otra manera, por ejemplo la serialización XML, eso ya depende de tus preferencias:
XmlSerializer Class - MSDN

Ejemplo del archivo "app.dat" usando serialización Binaria:
Código:
0001 0000 00ff ffff ff01 0000 0000 0000
000c 0200 0000 4a57 696e 646f 7773 4170
706c 6963 6174 696f 6e31 2c20 5665 7273
696f 6e3d 312e 302e 302e 302c 2043 756c
7475 7265 3d6e 6575 7472 616c 2c20 5075
626c 6963 4b65 7954 6f6b 656e 3d6e 756c
6c05 0100 0000 2057 696e 646f 7773 4170
706c 6963 6174 696f 6e31 2e43 6f6e 6669
6753 7472 7563 7407 0000 0004 4175 7468
044c 6f67 6904 4361 6c63 0448 6f6c 6104
4d65 6e73 0445 6e74 7204 5061 7261 0101
0101 0101 0102 0000 0006 0300 0000 0a41
7574 6820 7661 6c75 6506 0400 0000 0a4c
6f67 6920 7661 756c 6506 0500 0000 0a43
616c 6320 7661 756c 6506 0600 0000 0a48
6f6c 6120 7661 756c 6506 0700 0000 0a4d
656e 7320 7661 756c 6506 0800 0000 0a45
6172 6120 7661 756c 650b

Ejemplo del archivo "app.dat" usando serialización XML:
Código
  1. <?xml version="1.0"?>
  2. <ConfigStruct xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  3.  <Auth>Auth value</Auth>
  4.  <Logi>Logi vaule</Logi>
  5.  <Calc>Calc vaule</Calc>
  6.  <Hola>Hola vaule</Hola>
  7.  <Mens>Mens vaule</Mens>
  8.  <Entr>Entr vaule</Entr>
  9.  <Para>Para vaule</Para>
  10. </ConfigStruct>

Por cierto, ahora que reviso el código que te mostré en el primer post, me he dado cuenta de que cometí un fallo de escritura en la documentación XML este método:
Citar
Código
  1. /// <param name="filepath">The filepath to save the obstore the serialized data.</param>
  2. public static void Serialize<T>(T @object, string filepath)
  3. ...

Quise escribir esto:
Código
  1. /// <param name="filepath">The filepath to store the serialized data.</param>
  2. public static void Serialize<T>(T @object, string filepath)
  3. ...

Saludos
« Última modificación: 6 Mayo 2015, 13:36 pm por Eleкtro » En línea



Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda escritura archivo en C#
« Respuesta #4 en: 6 Mayo 2015, 14:14 pm »

En el código que has añadido en la edición de tu comentario, no liberas el objeto 'escritor', aparte de eso ...alguna otra cosa de menor importancia es que deberías aprovechar la declaración Using, y seguir las buenas prácticas de convenciones de nomenclatura en C# por que 'setAutentificacion' es incorrecto, el Camel-Casing se utiliza al declarar variables (y depende del tipo de visibilidad con la que la declares), los nombres de método se escriben utilizando Word-Casing.

Esto no soluciona el problema que tengas, pero por el momento el código queda más simplificado:
Código
  1. public bool SetAutentificacion(string certificado)
  2. {
  3.    int index = 0;
  4.    string contenido = null;
  5.    System.Text.Encoding encoding = System.Text.Encoding.Default;
  6.  
  7.    using (StreamWriter escritor = new StreamWriter(path: escritura, append: false, encoding: encoding))
  8.    {
  9.  
  10.        using (StreamReader lector = new StreamReader(path: lectura, encoding: encoding))
  11.        {
  12.            contenido = lector.ReadToEnd();
  13.        }
  14.  
  15.        index = contenido.IndexOf(vector(0));
  16.  
  17.        if ((index != -1))
  18.        {
  19.            contenido = contenido.Insert(contenido.IndexOf(vector(0)), certificado);
  20.            int entrada = contenido.LastIndexOf(vector(0) + certificado);
  21.            int salida = contenido.IndexOf(vector(1));
  22.            contenido.Remove(entrada, salida - entrada);
  23.            escritor.Write(contenido);
  24.        }
  25.    }
  26.    return (index != -1);
  27. }

PD: Omito la extensión '.ToString' por que doy por hecho que estás utilizando una colección de Strings, y sino, deberías hacerlo. Especifica que tipo de objeto es "vector".



Por cierto, no entiendo porque esto:

Código
  1. contenido.LastIndexOf(vector[0].ToString())

Vale cero cuando la cadena contenido contiene:

Creo que estás confundiendo la utilización de la función 'LastIndexOf', ¿que valor esperas obtener al llamar a contenido.LastIndexOf?, te está devolviendo el valor correcto, '0' es la posición del primer caracter de la última coindidencia del string que estás buscando.

Si lo que pretendes es obtener la posición del último caracter de la última coincidencia del string que buscas, entonces debes añadirle la longitud ese se string:
Código
  1. Dim str As String = "Hello World"
  2. Dim find As String = "Hello"
  3. Dim index As Integer
  4.  
  5. index = str.LastIndexOf(find) + find.Length ' Resultado: 5

O si pretendes obtener la posición del último caracter de la primera coincidencia del string que buscas, sería así:
Código
  1. index = str.IndexOf(find) + find.Length ' Resultado: 5

En este ejemplo ambos resultados son el mismo por que solo se puede encontrar una coincidencia de la palabra "Hello" en el string "Hello World". ¿entiendes?.

Saludos
« Última modificación: 6 Mayo 2015, 14:29 pm por Eleкtro » En línea



Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Ayuda escritura archivo en C#
« Respuesta #5 en: 7 Mayo 2015, 16:21 pm »

Lo primero muchas gracias a elektro, eres un autentico crack de veras gracias por la ayuda.

Lo de settigs es muy atractivo, pero no deja de ser un archivo mas junto a la app, y si podria cargar variables y ponerlas en binario etc, pero ya en el punto que estaba no iba a cambiarlo todo la proxima vez lo tendré en cuenta.

Ya tengo la clase archivo con metodos get y set que me escriben en el archivo los datos en cada apartado guiándose por los indexof(), y cadenas separadoras. Y funciona bien.

Tengo que meter un control de errores para comprobar si el archivo esta corrompido y restaurarlo en el caso.

En lo del método setAutentificación, puedo decirte que en clase siempre hemos usado Camel-Case para Java y de ahí lo lleve a C#, aunque no siempre me han gustado

Y por lo de indexof() muchas gracias, pensaba que ambos eran para la primera coincidencia, y que uno se situaba al principio de la coincidencia indexof y otro al inal lastindexof.

Ahora lo que me pasa no se si tendrá remedio, quiero trabajar sobre un solo archivo, tengo que abrirlo leerlo y sobreescribirlo, es decir leer su contenido y escribir lo que quiero cambiar en el solo. No sé si es posible, antes hice 2 archivos distintos un StreamWriter y un StreamReader.

Código
  1. private FileStream lectura;
  2.        private FileStream escritura;
  3.  
  4.        public Archivo(String directorio)
  5.        {
  6.            this.lectura = new FileStream(directorio + "\\app1.txt", FileMode.Open);
  7.            this.escritura = new FileStream(directorio + "\\app2.txt", FileMode.Create);
  8.        }

¿No se puede hacer de alguna manera con un solo FileStream leer el archivo y a la vez escribirlo?
Antes de nada voy a probar a hacerlo con un solo FileStream archivo.

Creo que así es posible, fuera StreamReader y StreamWriter. Un solo FileStream tiene métodos de lectura y escritura, creo que ahí estará lo que busco, de todas formas trabaja con bytes y me costará un poco, si creéis que hay otro camino mejor no estaría demás comentarlo.

Gracias estoy con ello socios.

Edito: Luego tengo pensado  cifrar todo el archivo y puede quedar bastante elegante. Saludos.

Ya encontre la respuesta :
http://stackoverflow.com/questions/605685/how-to-both-read-and-write-a-file-in-c-sharp

Se olvidan de FileStream, StreamReader y StreamWriter, una maravilla. Aunque habrá que controlar excepciones. gg.

Código
  1. static void Main(string[] args)
  2.    {
  3.        var text = File.ReadAllText(@"C:\words.txt");
  4.        File.WriteAllText(@"C:\words.txt", text + "DERP");
  5.    }

Simplemente leo todo en una cadena, la modifico y escribo la nueva cadena en el mismo archivo sobreescribiendo los datos anteriores :))

Por cierto elektro tienes razón con los metodos, pues los metodos por defecto de las clases salen ambas palabras comenando en mayuscula.

He avanzado bastante con el proyecto, asi da gusto, espero seguir dándole caña, siempre mejorando.
« Última modificación: 7 Mayo 2015, 17:32 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.878



Ver Perfil
Re: Ayuda escritura archivo en C#
« Respuesta #6 en: 7 Mayo 2015, 19:58 pm »

Se olvidan de FileStream, StreamReader y StreamWriter, una maravilla. Aunque habrá que controlar excepciones. gg.

Y la Class StringReader, StringWritter, y StringBuilder, miratelas (esta última para construir un string multilinea viene muy bien con el método Append, AppendFormat y/o AppendLine).

StringReader Class - MSDN
StringWriter Class - MSDN
StringBuilder Class - MSDN

PD: La Class StringWritter expone su StringBuilder llamando a StringWriter.GetStringBuilder.

Saludos

« Última modificación: 7 Mayo 2015, 20:05 pm por Eleкtro » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Escritura en reverza de una archivo
Java
morenochico 5 4,286 Último mensaje 13 Octubre 2007, 01:45 am
por .hack//
Problema escritura objetos en archivo
Java
panaka 3 4,619 Último mensaje 20 Febrero 2010, 19:02 pm
por Leyer
[Solucionado][BATCH]Problema con escritura en archivo.
Scripting
FranciskoAsdf 4 3,246 Último mensaje 1 Abril 2011, 14:55 pm
por FranciskoAsdf
Hacer archivo para solo escritura
Java
dule93 1 1,823 Último mensaje 11 Mayo 2015, 03:56 am
por bengy
Error escritura de vector con registro en archivo.dat C/C++
Programación C/C++
DK89 0 1,635 Último mensaje 23 Febrero 2017, 15:07 pm
por DK89
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines