CSharp - Clase Fichero (Tratamiento de ficheros)
Written by lopezatienza on 13 Diciembre 2009 – 23:01 -Aquí os dejo una clase de tratamiento de ficheros con las siguientes opciones entre otras:
- Apertura de ficheros.
- Cerrar ficheros.
- Lectura de ficheros.
- Escritura de ficheros.
- Existencia de ficheros.
- Borrar ficheros.
- Búsqueda de palabras en ficheros.
- Búsqueda dicotómica.
using System;
using System.IO;
using System.Windows.Forms;
using System.Collections;
/// <summary>
/// CLASE FICHERO (Tratamiento de Ficheros)
/// </summary>
public class Fichero
{
//public static FileStream Fitxer;
private static StreamReader LineaLeer;
private static StreamWriter LineaEscribir;
private string _Path = "";
private int _Estado = 0;
public readonly string Ruta;
public readonly string NombreFichero;
public static string Path_Aplicacion = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + @"\";
# region Ficheros
// Definimos el path del fichero en el constructor
public Fichero(string Path)
{
_Path = Path;
// Guardamos la ruta
Ruta = _Path;
// Para sacar el nombre del fichero le quitamos toda la ruta
NombreFichero=_Path;
while (NombreFichero.IndexOf(@"\") != -1)
{
NombreFichero = NombreFichero.Substring(NombreFichero.IndexOf(@"\")+1);
}
}
public bool Borrar() // INSTANCIA
{
// Primero miramos el estado para comprobar si el fichero esta abierto.
Cerrar();
try
{
// Comprobamos que existe para borrarlo.
if (Existe(_Path))
{
FileInfo f = new FileInfo(_Path );
f.Attributes=FileAttributes.Normal;
File.Delete(_Path);
return true;
}
}
catch { }
return false;
}
public static bool Borrar(string Path) //ESTATICO
{
try
{
// Comprobamos que existe para borrarlo.
if (Existe(Path))
{
FileInfo f = new FileInfo(Path );
f.Attributes=FileAttributes.Normal;
File.Delete(Path);
return true;
}
}
catch { }
return false;
}
public bool Existe()
{
if (System.IO.File.Exists(_Path)) return true;
else return false;
}
public static bool Existe(string Path)
{
if (System.IO.File.Exists(Path)) return true;
else return false;
}
public int Estado()
{
return _Estado;
}
public bool Abrir(bool Lectura)
{
try
{
if (Lectura)
{
if (Existe())
{
if (_Estado == 2)
{
if (MessageBox.Show("El fichero ya esta abierto en modo escritura. ¿Quiere cerrarlo para abrirlo en modo lectura?", NombreFichero, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
Cerrar();
}
else return false;
}
if (_Estado==0) LineaLeer = new StreamReader(_Path, System.Text.Encoding.Default);
_Estado = 1;
return true;
}
else return false;
}
else
{
if (_Estado == 1)
{
if (MessageBox.Show("El fichero ya esta abierto en modo lectura. ¿Quiere cerrarlo para abrirlo en modo escritura?", NombreFichero, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes)
{
Cerrar();
}
else return false;
}
if (_Estado == 0) LineaEscribir = new StreamWriter(_Path, true, System.Text.Encoding.Default);
_Estado = 2;
return true;
}
}
catch (IOException ioex)
{
MessageBox.Show(ioex.Message, "Abrir", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
return false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Abrir", MessageBoxButtons.OK, MessageBoxIcon.Hand, MessageBoxDefaultButton.Button1);
return false;
}
}
public void Cerrar()
{
try
{
switch (_Estado)
{
case 1: LineaLeer.Close(); break;
case 2: LineaEscribir.Close(); break;
}
_Estado = 0;
}
catch{}
}
public void Escribir(string Texto)
{
try
{
if (_Estado == 2)
{
LineaEscribir.WriteLine(Texto);
LineaEscribir.Flush();
}
}
catch (Exception ex)
{
string Fallo = ex.Message;
//throw;
}
}
public string Leer()
{
string Linia = "";
try
{
Linia = LineaLeer.ReadLine();
}
catch
{
Linia = null;
}
return Linia;
}
#region Busqueda Dicotomica (Fichero Ordenado)
public string Buscar_Ord(string CampoBuscar, int NumeroCampo, char Separador)
{ // CampoBuscar = Camop buscado en el archivo
// NumeroCampo = Posicion del campo en la linea
// Separador = cter separador de campo
try
{
FileStream fs = new FileStream(_Path, FileMode.Open);
FileInfo fileInf = new FileInfo(_Path);
BinaryReader br = new BinaryReader(fs);
long IniFich = 0;
long FinFich = fileInf.Length;
long posIni = IniFich; // Posicion desde donde empezamos a buscar
long posFin = FinFich; //Posicion hasta donde vamos a buscar
string linea = ""; //Linea en la que nos encontramos
bool encontrado = false; //nos dira cuando hemos encontrado el string
int intCter; // Contendra el ASCII del caracter actual
long i; // Ayuda a recorrer el archivo
int resComparacion; // Resultado de las comparaciones entre string
string[] Campos; // Vector con los campos de la linea
//Para controlar fin de busqueda
bool esPrimeraLinea = false; //Nos dice si estamos en la primera linea
bool esUltimaLinea = false; //Si estamos en la ultima linea
string lineaAntigua = ""; //Controla cuando buscamos elemento intermedio y no existe
//Si linea actual = antigua, es que no encontramos elemento
while ((!encontrado) && (posIni <= posFin))
{
//Nos posicionamos en la mitad del tamaño de la zona de busqueda
linea = "";
long mitad = (posIni + posFin) / 2;
#region Obtencion de la linea actual
//Recuperamos la linea en la que no encontramos
//1º Obtengo el caracter de mitad del archivo
//2º Almaceno en "linea" desde el actual caracter, hasta el principio de la linea
i = mitad;
br.BaseStream.Position = i;
while (((intCter = br.Read()) != -1) && (intCter != 10) && (i >= IniFich))//Salto de linea
{//leemos caracteres anteriores al actual hasta llegar al principio de la linea
linea = Convert.ToChar(intCter) + linea;
i--;
if (i >= IniFich)
br.BaseStream.Position = i;
else
esPrimeraLinea = true;
}
//3º Almaceno en "linea" desde el actual caracter, hasta el final de la linea
i = mitad + 1;
br.BaseStream.Position = i;
while (((intCter = br.Read()) != -1) && (intCter != 13))//retorno de carro
{//leemos los caracteres siguientes al de la mitad del archivo hasta el final de la linea
linea += Convert.ToChar(intCter);
i++;
br.BaseStream.Position = i;
}
if (intCter == -1) //Controlamos si es ultima fila
esUltimaLinea = true;
#endregion
//Una vez obtenida la linea actual, obtenemos el campo indicado
//y realizamos las comparaciones para saber si tenemos que seguir buscando o no
Campos = linea.Split(Separador);
if (NumeroCampo >= Campos.Length) //Error en la busqueda
throw new Exception();
//Si linea actual = linea antigua, es que no existe el elemento buscado
if (string.Compare(linea, lineaAntigua) == 0)
posFin = posIni - 1; //Forzamos salida bucle
else
lineaAntigua = linea;
resComparacion = string.Compare(CampoBuscar.ToLower(), Campos[NumeroCampo].ToLower());
//Campos[NumeroCampo].Contains(
if (resComparacion == 0) //lo hemos encontrado
encontrado = true;
else if ((esPrimeraLinea) || (esUltimaLinea))
posFin = posIni - 1; //Forzamos salida bucle
else if (resComparacion < 0)
posFin = mitad;
else
posIni = mitad;
}
fs.Close();
br.Close();
if (encontrado)
return linea;
else
return null;
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
return null;
}
}
public string Buscar_Ord(string CampoBuscar, int PosicionInicial, int PosicionFinal)
{ // CampoBuscar = Camop buscado en el archivo
// PosicionInicial = Posicion del primer cter a comparar
// PosicionFinal = Posicion del ultimo caracter a comparar
try
{
FileStream fs = new FileStream(_Path, FileMode.Open);
FileInfo fileInf = new FileInfo(_Path);
BinaryReader br = new BinaryReader(fs);
long IniFich = 0;
long FinFich = fileInf.Length;
//El campo buscado lo adaptamos a la lngitud pasada
string CampoBuscado = CampoBuscar.PadRight(PosicionFinal - PosicionInicial + 1, ' ');
long posIni = IniFich; // Posicion desde donde empezamos a buscar
long posFin = FinFich; //Posicion hasta donde vamos a buscar
string linea = ""; //Linea en la que nos encontramos
bool encontrado = false; //nos dira cuando hemos encontrado el string
int intCter; // Contendra el ASCII del caracter actual
long i; // Ayuda a recorrer el archivo
int resComparacion; // Resultado de las comparaciones entre string
//Para controlar fin de busqueda
bool esPrimeraLinea = false; //Nos dice si estamos en la primera linea
bool esUltimaLinea = false; //Si estamos en la ultima linea
string lineaAntigua = ""; //Controla cuando buscamos elemento intermedio y no existe
//Si linea actual = antigua, es que no encontramos elemento
while ((!encontrado) && (posIni <= posFin))
{
//Nos posicionamos en la mitad del tamaño de la zona de busqueda
linea = "";
long mitad = (posIni + posFin) / 2;
#region Obtencion de la linea actual
//Recuperamos la linea en la que no encontramos
//1º Obtengo el caracter de mitad del archivo
//2º Almaceno en "linea" desde el actual caracter, hasta el principio de la linea
i = mitad;
br.BaseStream.Position = i;
while (((intCter = br.Read()) != -1) && (intCter != 10) && (i >= IniFich))//Salto de linea
{//leemos caracteres anteriores al actual hasta llegar al principio de la linea
linea = Convert.ToChar(intCter) + linea;
i--;
if (i >= IniFich)
br.BaseStream.Position = i;
else
esPrimeraLinea = true;
}
//3º Almaceno en "linea" desde el actual caracter, hasta el final de la linea
i = mitad + 1;
br.BaseStream.Position = i;
while (((intCter = br.Read()) != -1) && (intCter != 13))//retorno de carro
{//leemos los caracteres siguientes al de la mitad del archivo hasta el final de la linea
linea += Convert.ToChar(intCter);
i++;
br.BaseStream.Position = i;
}
if (intCter == -1) //Controlamos si es ultima fila
esUltimaLinea = true;
#endregion
//Si linea actual = linea antigua, es que no existe el elemento buscado
if (string.Compare(linea, lineaAntigua) == 0)
posFin = posIni - 1; //Forzamos salida bucle
else
lineaAntigua = linea;
resComparacion = string.Compare(CampoBuscado.ToLower(),
linea.Substring(PosicionInicial, PosicionFinal - PosicionInicial + 1).ToLower());
if (resComparacion == 0) //lo hemos encontrado
encontrado = true;
else if ((esPrimeraLinea) || (esUltimaLinea))
posFin = posIni - 1; //Forzamos salida bucle
else if (resComparacion < 0)
posFin = mitad;
else
posIni = mitad;
}
fs.Close();
br.Close();
if (encontrado)
return linea;
else
return null;
}
catch (Exception e)
{
MessageBox.Show(e.Message.ToString());
return null;
}
}
#endregion pablo;
#region Busqueda Simple
public string Buscar(string CampoBuscar, int NumeroCampo, char Separador, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
string palabra = "";
bool encontrar = false;
string linea = "";
if (System.IO.File.Exists(_Path))
{
StreamReader LineaLeer = new StreamReader(_Path);
string sLine = "";
ArrayList arrText = new ArrayList();
while (sLine != null)
{
sLine = LineaLeer.ReadLine();
if (sLine != null)
{
string cadena = sLine;
if (cadena.IndexOf(Separador) < 1)
// comprobar si en la linea seleccionada hay algun separador
{
palabra = cadena;
palabra = palabra.Substring(0, CampoBuscar.Length);
}
else
{
string[] vector = cadena.Split(Separador);
// calcular el numero de separadores de esa linea
try
{
palabra = vector[NumeroCampo];
}
catch
{
break;
}
}
if (BusquedaExacta == true)
{
if (String.Compare(palabra.ToLower(), CampoBuscar.ToLower()) == 0)
{
// PARA IR GUARDANDOLO EN UN ARRAY TODOS LOS VALORES QUE ENCUENTRE
arrText.Add(sLine);
encontrar = true;
linea = sLine;
// tiempo(ahora);
// break;
}
}
else
{
if (palabra.IndexOf(CampoBuscar.ToLower()) > -1)
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
// MessageBox.Show(sLine);
// tiempo(ahora);
//break;
}
}
}
}
LineaLeer.Close();
//Cuando no encuentra el campo buscado
if (encontrar == false)
linea = null;
}
else
MessageBox.Show("ARCHIVO NO ENCONTRADO");
return linea;
}
public string Buscar(string CampoBuscar, int PosicionInicial, int PosicionFinal, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
bool encontrar = false;
string distancia = "";
string linea = "";
if (System.IO.File.Exists(_Path))
{
StreamReader LineaLeer = new StreamReader(_Path);
string sLine = "";
ArrayList arrText = new ArrayList();
while (sLine != null)
{
sLine = LineaLeer.ReadLine();
if (sLine != null)
{
if (PosicionFinal == 0)
// cuando no pone posicion final me recorreria la frase entera
try
{
distancia = sLine.Substring(PosicionInicial);
}
catch
{
break;
}
else
try
//cuando se las dos posiciones
{
distancia = sLine.Substring(PosicionInicial, PosicionFinal - PosicionInicial + 1);
}
catch
{
break;
}
if (BusquedaExacta == true)
{
if (string.Compare(distancia, CampoBuscar.ToLower()) == 0 ||
string.Compare(distancia, CampoBuscar.ToUpper()) == 0)
{
encontrar = true;
linea = sLine;
break;
}
}
else
{
if ((distancia.IndexOf(CampoBuscar.ToLower()) > -1) || (distancia.IndexOf(CampoBuscar.ToUpper()) > -1))
{
encontrar = true;
linea = sLine;
break;
}
}
}
}
LineaLeer.Close();
//cuando no encuetra el campo
if (encontrar == false)
linea = null;
}
else
Error.Mostrar("Arhivo no encontrado.","ERROR");
return linea;
}
#endregion;
#region BuscarTodo (Devuelve todos los valores buscados)
public static string[] BuscarTodo(string Path, string CampoBuscar, int NumeroCampo, char Separador, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
string Campo = "";
bool encontrar = false;
string linea = "";
string[] matriz = null;
ArrayList arrText = new ArrayList();
if (System.IO.File.Exists(Path))
{
StreamReader LineaLeer = new StreamReader(Path);
string sLine = "";
while (sLine != null)
{
sLine = LineaLeer.ReadLine();
if (sLine != null)
{
string cadena = sLine;
if (cadena.IndexOf(Separador) < 1)
// comprobar si en la linea seleccionada hay algun separador
{
Campo = cadena;
Campo = Campo.Substring(0, CampoBuscar.Length);
}
else
{
string[] vector = cadena.Split(Separador);
// calcular el numero de separadores de esa linea
try
{
Campo = vector[NumeroCampo];
}
catch
{
break;
}
}
if (BusquedaExacta == true)
{
if (String.Compare(Campo.ToLower(), CampoBuscar.ToLower()) == 0)
{
// PARA IR GUARDANDOLO EN UN ARRAY TODOS LOS VALORES QUE ENCUENTRE
arrText.Add(sLine);
encontrar = true;
linea = sLine;
}
}
else
{
if (Campo.ToLower().IndexOf(CampoBuscar.ToLower()) > -1)
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
}
}
LineaLeer.Close();
}
else
Error.Mostrar("Arhivo no encontrado.", "ERROR");
if (encontrar == true)
matriz = (string[])arrText.ToArray(typeof(string));
else matriz = null;
return matriz;
}
public string[] BuscarTodo(string CampoBuscar, int NumeroCampo, char Separador, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
string Campo = "";
bool encontrar = false;
string linea = "";
string[] matriz = null;
ArrayList arrText = new ArrayList();
// Si el fichero esta abierto lo cerramos
if (_Estado > 0) Cerrar();
if (Abrir(true))
{
string sLine = "";
while (sLine != null)
{
sLine = Leer();
if (sLine != null)
{
string cadena = sLine;
if (cadena.IndexOf(Separador) < 1)
// comprobar si en la linea seleccionada hay algun separador
{
Campo = cadena;
Campo = Campo.Substring(0, CampoBuscar.Length);
}
else
{
string[] vector = cadena.Split(Separador);
// calcular el numero de separadores de esa linea
try
{
Campo = vector[NumeroCampo];
}
catch
{
break;
}
}
if (BusquedaExacta == true)
{
if (String.Compare(Campo.ToLower(), CampoBuscar.ToLower()) == 0)
{
// PARA IR GUARDANDOLO EN UN ARRAY TODOS LOS VALORES QUE ENCUENTRE
arrText.Add(sLine);
encontrar = true;
linea = sLine;
}
}
else
{
if (Campo.ToLower().IndexOf(CampoBuscar.ToLower()) > -1)
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
}
}
}
else
Error.Mostrar("Arhivo no encontrado.", "ERROR");
if (encontrar == true) matriz = (string[])arrText.ToArray(typeof(string));
else matriz = null;
return matriz;
}
public static string[] BuscarTodo(string Path, string CampoBuscar, int PosicionInicial, int PosicionFinal, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
bool encontrar = false;
string distancia = "";
string linea = "";
string[] matriz = null;
ArrayList arrText = new ArrayList();
if (System.IO.File.Exists(Path))
{
StreamReader LineaLeer = new StreamReader(Path);
string sLine = "";
while (sLine != null)
{
sLine = LineaLeer.ReadLine();
if (sLine != null)
{
if (PosicionFinal == 0)
{
// cuando no pone posicion final me recorreria la frase entera
try
{
distancia = sLine.Substring(PosicionInicial);
}
catch
{
break;
}
}
else
{
try
//cuando se las dos posiciones
{
distancia = sLine.Substring(PosicionInicial, PosicionFinal - PosicionInicial + 1);
}
catch
{
break;
}
}
if (BusquedaExacta == true)
{
if (string.Compare(distancia, CampoBuscar.ToLower()) == 0 ||
string.Compare(distancia, CampoBuscar.ToUpper()) == 0)
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
else
{
if ((distancia.ToLower().IndexOf(CampoBuscar.ToLower()) > -1) || (distancia.ToLower().IndexOf(CampoBuscar.ToUpper()) > -1))
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
}
}
LineaLeer.Close();
}
else
Error.Mostrar("Arhivo no encontrado.", "ERROR");
if (encontrar == true)
matriz = (string[])arrText.ToArray(typeof(string));
else matriz = null;
return matriz;
}
public string[] BuscarTodo( string CampoBuscar, int PosicionInicial, int PosicionFinal, bool BusquedaExacta)
{
long ahora = DateTime.Now.Ticks;
bool encontrar = false;
string distancia = "";
string linea = "";
string[] matriz = null;
ArrayList arrText = new ArrayList();
// Si el fichero esta abierto lo cerramos
if (_Estado > 0) Cerrar();
if (Abrir(true))
{
string sLine = "";
while (sLine != null)
{
sLine = Leer();
if (sLine != null)
{
if (PosicionFinal == 0)
{
// cuando no pone posicion final me recorreria la frase entera
try
{
distancia = sLine.Substring(PosicionInicial);
}
catch
{
break;
}
}
else
{
try
//cuando se las dos posiciones
{
distancia = sLine.Substring(PosicionInicial, PosicionFinal - PosicionInicial + 1);
}
catch
{
break;
}
}
if (BusquedaExacta == true)
{
if (string.Compare(distancia, CampoBuscar.ToLower()) == 0 ||
string.Compare(distancia, CampoBuscar.ToUpper()) == 0)
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
else
{
if ((distancia.ToLower().IndexOf(CampoBuscar.ToLower()) > -1) || (distancia.ToLower().IndexOf(CampoBuscar.ToUpper()) > -1))
{
encontrar = true;
linea = sLine;
arrText.Add(sLine);
}
}
}
}
}
else
Error.Mostrar("Arhivo no encontrado.","ERROR");
if (encontrar == true)
matriz = (string[])arrText.ToArray(typeof(string));
else matriz = null;
return matriz;
}
#endregion
}
Descargar Clase Fichero.cs
pass: lopezatienza.es
Tags: C#, CSharp
Posted in CSharp |
