2010-05-31 10 views
5

Tengo que escribir los datos a continuación en un archivo de texto después de reemplazar dos valores con ## IP ##, ## PORT ##. ¿Cuál es la mejor manera? ¿Debo contener todo en una cadena y usar Reemplazar y escribir en archivo de texto?La mejor manera de manejar cadenas enormes en C#

datos:

[APP] 
    iVersion= 101 
    pcVersion= 1.01a 
    pcBuildDate=Mar 27 2009 
[MAIN] 
    iFirstSetup=  0 
    rcMain.rcLeft= 676 
    rcMain.rcTop=  378 
    rcMain.rcRight= 1004 
    rcMain.rcBottom= 672 
    iShowLog=   0 
    iMode=    1 
[GENERAL] 
    iTips=    1 
    iTrayAnimation=  1 
    iCheckColor=  1 
    iPriority=   1 
    iSsememcpy=   1 
    iAutoOpenRecv=  1 
    pcRecvPath=   C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\recv 
    pcFileName=   FantasyRemote 
    iLanguage=   1 
[SERVER] 
    iAcceptVideo=  1 
    iAcceptAudio=  1 
    iAcceptInput=  1 
    iAutoAccept=  1 
    iAutoTray=   0 
    iConnectSound=  1 
    iEnablePassword= 0 
    pcPassword= 
    pcPort=   7902 
[CLIENT] 
    iAutoConnect=  0 
    pcPassword= 
    pcDefaultPort= 7902 
[NETWORK] 
    pcConnectAddr=##IP## 
    pcPort=##Port## 
[VIDEO] 
    iEnable=     1 
    pcFcc=     AMV3 
    pcFccServer=   
    pcDiscription=   
    pcDiscriptionServer= 
    iFps=     30 
    iMouse=     2 
    iHalfsize=    0 
    iCapturblt=    0 
    iShared=     0 
    iSharedTime=    5 
    iVsync=     1 
    iCodecSendState=   1 
    iCompress=    2 
    pcPlugin=    
    iPluginScan=    0 
    iPluginAspectW=   16 
    iPluginAspectH=   9 
    iPluginMouse=    1 
    iActiveClient=   0 
    iDesktop1=    1 
    iDesktop2=    2 
    iDesktop3=    0 
    iDesktop4=    3 
    iScan=     1 
    iFixW=     16 
    iFixH=     8 
[AUDIO] 
    iEnable=     1 
    iFps=     30 
    iVolume=     6 
    iRecDevice=    0 
    iPlayDevice=    0 
    pcSamplesPerSec= 44100Hz 
    pcChannels=  2ch:Stereo 
    pcBitsPerSample=  16bit 
    iRecBuffNum=   150 
    iPlayBuffNum=    4 
[INPUT] 
    iEnable=     1 
    iFps=     30 
    iMoe=      0 
    iAtlTab=     1 
[MENU] 
    iAlwaysOnTop=    0 
    iWindowMode=    0 
    iFrameSize=    4 
    iSnap=     1 
[HOTKEY] 
    iEnable=       1 
    key_IDM_HELP=    0x00000070 
    mod_IDM_HELP=    0x00000000 
    key_IDM_ALWAYSONTOP=  0x00000071 
    mod_IDM_ALWAYSONTOP=  0x00000000 
    key_IDM_CONNECT=   0x00000072 
    mod_IDM_CONNECT=   0x00000000 
    key_IDM_DISCONNECT=  0x00000073 
    mod_IDM_DISCONNECT=  0x00000000 
    key_IDM_CONFIG=   0x00000000 
    mod_IDM_CONFIG=   0x00000000 
    key_IDM_CODEC_SELECT=  0x00000000 
    mod_IDM_CODEC_SELECT=  0x00000000 
    key_IDM_CODEC_CONFIG=  0x00000000 
    mod_IDM_CODEC_CONFIG=  0x00000000 
    key_IDM_SIZE_50=   0x00000074 
    mod_IDM_SIZE_50=   0x00000000 
    key_IDM_SIZE_100=   0x00000075 
    mod_IDM_SIZE_100=   0x00000000 
    key_IDM_SIZE_200=   0x00000076 
    mod_IDM_SIZE_200=   0x00000000 
    key_IDM_SIZE_300=   0x00000000 
    mod_IDM_SIZE_300=   0x00000000 
    key_IDM_SIZE_400=   0x00000000 
    mod_IDM_SIZE_400=   0x00000000 
    key_IDM_CAPTUREWINDOW=  0x00000077 
    mod_IDM_CAPTUREWINDOW=  0x00000004 
    key_IDM_REGION=   0x00000077 
    mod_IDM_REGION=   0x00000000 
    key_IDM_DESKTOP1=   0x00000078 
    mod_IDM_DESKTOP1=   0x00000000 
    key_IDM_ACTIVE_MENU=  0x00000079 
    mod_IDM_ACTIVE_MENU=  0x00000000 
    key_IDM_PLUGIN=   0x0000007A 
    mod_IDM_PLUGIN=   0x00000000 
    key_IDM_PLUGIN_SCAN=  0x00000000 
    mod_IDM_PLUGIN_SCAN=  0x00000000 
    key_IDM_DESKTOP2=   0x00000078 
    mod_IDM_DESKTOP2=   0x00000004 
    key_IDM_DESKTOP3=   0x00000079 
    mod_IDM_DESKTOP3=   0x00000004 
    key_IDM_DESKTOP4=   0x0000007A 
    mod_IDM_DESKTOP4=   0x00000004 
    key_IDM_WINDOW_NORMAL=  0x0000000D 
    mod_IDM_WINDOW_NORMAL=  0x00000004 
    key_IDM_WINDOW_NOFRAME= 0x0000000D 
    mod_IDM_WINDOW_NOFRAME= 0x00000002 
    key_IDM_WINDOW_FULLSCREEN= 0x0000000D 
    mod_IDM_WINDOW_FULLSCREEN= 0x00000001 
    key_IDM_MINIMIZE=   0x00000000 
    mod_IDM_MINIMIZE=   0x00000000 
    key_IDM_MAXIMIZE=   0x00000000 
    mod_IDM_MAXIMIZE=   0x00000000 
    key_IDM_REC_START=   0x00000000 
    mod_IDM_REC_START=   0x00000000 
    key_IDM_REC_STOP=   0x00000000 
    mod_IDM_REC_STOP=   0x00000000 
    key_IDM_SCREENSHOT=  0x0000002C 
    mod_IDM_SCREENSHOT=  0x00000002 
    key_IDM_AUDIO_MUTE=  0x00000073 
    mod_IDM_AUDIO_MUTE=  0x00000004 
    key_IDM_AUDIO_VOLUME_DOWN= 0x00000074 
    mod_IDM_AUDIO_VOLUME_DOWN= 0x00000004 
    key_IDM_AUDIO_VOLUME_UP= 0x00000075 
    mod_IDM_AUDIO_VOLUME_UP= 0x00000004 
    key_IDM_CTRLALTDEL=  0x00000023 
    mod_IDM_CTRLALTDEL=  0x00000003 
    key_IDM_QUIT=    0x00000000 
    mod_IDM_QUIT=    0x00000000 
    key_IDM_MENU=    0x0000007B 
    mod_IDM_MENU=    0x00000000 
[OVERLAY] 
    iIndicator=   1 
    iAlphaBlt=    1 
    iEnterHide=   0 
    pcFont=  MS UI Gothic 
[AVI] 
    iSound=     1 
    iFileSizeLimit=  100000 
    iPool=      4 
    iBuffSize=    32 
    iStartDiskSpaceCheck=  1 
    iStartDiskSpace=  1000 
    iRecDiskSpaceCheck=  1 
    iRecDiskSpace=   100 
    iCache=     0 
    iAutoOpen=     1 
    pcPath=C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\avi 
[SCREENSHOT] 
    iSound=  1 
    iAutoOpen= 1 
    pcPath=  C:\Documents and Settings\karthikeyan\My Documents\Downloads\fremote101a\FantasyRemote101a\ss 
    pcPlugin= BMP 
[CDLG_SERVER] 
    mrcWnd.rcLeft=  667 
    mrcWnd.rcTop=  415 
    mrcWnd.rcRight= 1013 
    mrcWnd.rcBottom= 634 
[CWND_CLIENT] 
    miShowLog=   0 
    m_iOverlayLock=  0 
[CDLG_CONFIG] 
    mrcWnd.rcLeft=  467 
    mrcWnd.rcTop=  247 
    mrcWnd.rcRight= 1213 
    mrcWnd.rcBottom= 802 
    miTabConfigSel=  2 
+0

¿Sabía que su navegador está manejando esto con fluidez, incluso mientras se agrega el marcado mediante javascript. – Dykam

+0

La mejor manera es no escribir una herramienta en C#, sino usar una herramienta lista para usar. –

Respuesta

4

que sugieren que acaba de leer el archivo y reemplazar. Debería estar bien. Si le preocupa el rendimiento, le sugiero que mida el rendimiento y trate de corregirlo más adelante si se trata de un problema.

Ejemplo.

string file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "foo.file"); 
string s = File.ReadAllText(file); 

s = s.Replace("##IP##", "127.0.0.1"); 
s = s.Replace("##PORT##", "80"); 

File.WriteAllText(file, s); 
6

¿Por qué aspecto a mí como un archivo INI? Intente usar Nini.

EDIT: Añadido muestra

Esta es la simple muestra cómo se puede utilizar la biblioteca Nini.

using System; 
    using Nini; 
    using Nini.Ini; 
    using Nini.Config; 
    using System.IO; 

    namespace CommandLine 
    { 
     class Test 
     { 
      static void Main(string[] Args) 
      { 
       string myIniTxt = Path.Combine(Environment.CurrentDirectory, "ini.txt"); 
       IniConfigSource ini = new IniConfigSource(myIniTxt); 
       IConfig config = ini.Configs["NETWORK"]; 
       config.Set("pcConnectAddr", "myValueForPcConnectAdd"); 
       config.Set("pcPort", "myValueForPcPort"); 
       ini.Save(); 
      } 
     } 
    } 

Observación: El primer enlace para "Nini" parece que no funciona bien, pero aquí hay algunos más.

http://sourceforge.net/projects/nini/

http://nini.sourceforge.net/Manual/NiniManual.htm

+0

+1 para usar Nini –

+0

¿Está seguro de que es compatible con .NET frameworks más nuevos que 1.1? – backslash17

+0

@ backslash17 Estoy usando NINI en un proyecto .NET 3,5 sin errores durante aproximadamente 1 año. – adopilot

1

Si estás muerto seguro sobre el tamaño del archivo y usted sabe que no será superior a decir un par de cientos de MB a continuación, leyó en la memoria y hacer una expresión regular reemplazar. Sin embargo, para mayor flexibilidad, prepararía el archivo una línea a la vez, realizaría el reemplazo y escribiría en un segundo archivo.

+0

Estoy seguro de que el tamaño del archivo no excederá. ¿Puedes dar un ejemplo para manejar esto ahora? – Anuya

3

Creo que puede usar un StringBuilder aquí.

StringBuilder le permite manipular/reemplazar una cadena en la misma ubicación de memoria.

Cada vez que manipula una cadena, se asigna nueva memoria para contener el resultado, y la cadena anterior es basura. StringBuilder está especialmente diseñado para hacer cadenas mutables.

Editar después de leer el comentario: La plantilla (el texto sin los reemplazos) se puede poner en una configuración de proyecto. El IDE se encargará del resto.

Si es realmente enorme, es mejor colocarlo en un archivo en la carpeta de instalación. Luego debe asegurarse de que el archivo esté instalado junto con su aplicación.

se pone el archivo "MyTemplate.txt" en un StringBuilder como esto:

var fileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase)), 
    "MyTemplate.txt"); 
var stringBuilder = new StringBuilder(File.ReadAllText(fileName)); 
+0

Pero, ¿cómo puedo agregar toda la información a una cadena ... porque hay muchas secuencias de escape necesarias !! – Anuya

1

También puede comprobar esto: Memory Efficiency and Performance of String.Replace .NET Framework.

Puede hacer lo siguiente para leer archivos, buscar, reemplazar y luego volver a escribir.

using System; 
using System.IO; 
using System.Text.RegularExpressions; 
static public void ReplaceInFile(string filePath, string searchText, string replaceText) 
{ 
    StreamReader reader = new StreamReader(filePath); 
    string content = reader.ReadToEnd(); 
    reader.Close(); 

    content = Regex.Replace(content, searchText, replaceText); 

    StreamWriter writer = new StreamWriter(filePath); 
    writer.Write(content); 
    writer.Close(); 
} 

Ver también el código desde cero: http://www.codeproject.com/KB/string/fastestcscaseinsstringrep.aspx

1

¿Debo mantener todo en una cadena y utilizar remplace y escribir en archivo de texto?

Eso es lo primero que debe intentar. La cadena es bastante pequeña (no megabytes), y supongo que no lo harás a menudo o en un bucle (solo lo harás una vez), y que la demora será solo una fracción de segundo que es bien para usted, y esa otra solución más complicada que usa StringBuilder no sería más que el doble de rápida.

0

La mejor manera es analizar manualmente el contenido del archivo y realizar reemplazos con StringBuilder.

+0

En ocasiones, "mejor" puede significar "líneas de código fuente menos obvias", p. usando el método 'string.Replace'. – ChrisW

Cuestiones relacionadas