2010-01-12 68 views
5

tengo que hacer lo siguiente:sobrescribir una línea específica en un archivo de texto usando VB.NET

Cambie la línea en un archivo de texto

[Path] = "c:\this\certain\path\" 

con esta línea

[Path] = "c:\that\other\newer\path\" 

Estas rutas serán sin duda de diferentes longitudes, por lo que necesito reemplazar lo que está en las comillas o borrar la línea por completo e ingresar una nueva, pero en el mismo lugar, no adjunta al final del documento.

Respuesta

1

leer el archivo de texto en una cadena, iterar sobre cada línea y comprobar si está en el formato:

[Path] = "...." (con expresiones regulares o simplemente con string.StartsWith("[Path] = "))

En este bucle se debe escribir a cabo todas las demás líneas y cuando esté en esta línea [Ruta], imprima la modificación.

Así en el código (lo siento, es en C#):

var reader = File.OpenText("foo.txt"); 
var writer = new StreamWriter("output.txt"); 
string line; 
while ((line=reader.ReadLine()) != null) 
{ 
    if (line.StartsWith("[Path]")) 
     writer.WriteLine("[Path] = \"c:\\that\\other\\newer\\path\\\""); 
    else 
     writer.WriteLine(line); 
} 

por supuesto, cerrar y disponer el StreamReader y StreamWriter.

+0

¿Puedo usar StreamWriter para la salida en el mismo archivo de texto o ¿Estás diciendo volver a escribir cada línea en el nuevo archivo y luego cambiarle el nombre al anterior? – Niphoet

+0

Trate de no escribir en el mismo archivo. ¡Es mucho más seguro de esa manera! No pierde casi nada creando un nuevo archivo y sobrescribiendo el anterior. – alex

+0

Puede agregar File.Copy ("output.txt", "foo.txt", true); File.Delete ("salida.txt"); por lo que parece que el archivo original fue sobrescrito. – Axarydax

1

Este es el problema: debido a la forma en que se almacenan los archivos en el disco, no puede escribir en una línea sin actualizar también cada línea que lo sigue.

Existen varias maneras de hacerlo, y la más adecuada para su situación dependerá de cosas como el tamaño del archivo, ¿está haciendo esto en muchos archivos, en el archivo que espera para encontrar esto, etc.

Pero la mayoría de las veces lo que me gusta hacer es crear una copia del archivo antiguo ... Así que mientras busco el archivo buscando la (s) línea (s) necesito cambiar , También escribo lo que leí en una nueva ubicación. Cuando encuentro la línea, escribo la nueva información. Luego sigo buscando el archivo hasta que llego al final, momento en el que cierro ambas transmisiones, elimino el original y cambio el nombre del nuevo.

0

Una forma rápida es utilizar readAllLines y WriteAllLines:

Dim ss() As String 
ss = File.ReadAllLines([path]) 
ss(47) = "c:\that\other\newer\path\" 
File.WriteAllLines([path], ss) 

Si usted no sabe qué línea para cambiar, se puede buscar a través de la matriz para que ss.

3

Si realmente sabe exactamente cómo se ve la línea que desea reemplazar y el archivo que está leyendo no es realmente grande, podría intentar simplemente usar Reemplazar() para agregar la nueva línea en lugar de la nueva:

Dim reader As New StreamReader("foo.txt") 
Dim writer As New StreamWriter("output.txt") 

Dim s = reader.ReadToEnd().Replace("[Path]: C:\oldPath\file.txt", "[Path]: C:\newPath") 
writer.Write(s) 
8

Esto va a hacer el truco

Dim thefile As String = "filepath" 
    Dim lines() As String = System.IO.File.ReadAllLines("filepath") 

    lines(number of line you want to replace) = "write what you want to replace here" 

    System.IO.File.WriteAllLines(filepath, lines) 
+0

¿Es preferible a 'StreamReader', además de que requiere menos código. ¿Esperaría que este método usara más recursos? – MrCalvin

0

en primer lugar construir una función para dar el valor de la línea de 'n':

Public Function daValorConfig(ByVal numValor As Long, ByVal nomeFicheiroINI As String) As String 
    Dim reader As StreamReader = New StreamReader(Application.StartupPath & "\" & nomeFicheiroINI & ".ini") 
    Dim valor As String = "" 
    daValorConfig = "" 
    Dim i As Long = 1 
    Try 
     While i <= numValor 
      valor = reader.ReadLine() 
      i = i + 1 
     End While 
     daValorConfig = valor 
     reader.Close() 
    Catch ex As Exception 
     reader.Close() 
     MessageBox.Show(ex.Message, "Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Err.Clear() 
    End Try 
End Function 

A continuación, crear un procedimiento que escribe el nuevo valor en la línea especificada o mantener la anterior si la línea no es la que se especifica:

Public Sub guardaValorConfig(ByVal dados As String, ByVal numValor As Long, ByVal nomeFicheiroINI As String) 

    Dim writer As StreamWriter = New StreamWriter(Application.StartupPath & "\" & nomeFicheiroINI & ".ini") 
    Dim valor As String = "" 
    Dim i As Long = 1 
    Try 
     While i <= numValor 
      If i = numValor Then 
       writer.Write(dados) 
      Else 
       writer.Write(daValorConfig(i, nomeFicheiroINI)) 
      End If 
      i = i + 1 
     End While 
     writer.Close() 
    Catch ex As Exception 
     MessageBox.Show(ex.Message, "Error: ", MessageBoxButtons.OK, MessageBoxIcon.Error) 
     Err.Clear() 
    End Try 
End Sub 
Cuestiones relacionadas