Ayuda con Aplicacion Windows Forms en C#

Iniciado por Slikp, 30 Noviembre 2015, 03:49 AM

0 Miembros y 1 Visitante están viendo este tema.

Slikp

- Un saludo a todo aquel que pueda ayudarme, en primer lugar debo decir que mis habilidades con la programacion son casi nulas y mas aun con este lenguaje de programacion C#. Yo simplemente he realizado cosas simples con Html y Css que no son lenguajes de programacion y una que otra tonteia con Php.

- Disculpen si lo que pido pueda llegar a ofenderlos dado que muchas veces he visto que comentan "Tal vez deberias googlear, antes de preguntar" y la verdad yo he googleado pero quizas no se como buscar lo que necesito y quizas tambien he encontrado algo no en concreto pero si algo que pueda ser un inicio pero por mis pocos conocimientos no he sabido aplicarlo.

- Bueno sin mas, estoy usando Microsoft Visual Studio 2012 y necesito una aplicacion de escritorio por lo tanto seleccione la opcion en Nuevo Proyecto de Aplicaciòn de Windows Forms "Espero sea la correcta", requiero leer N cantidad de archivos en un directorio pero no deseo obtener el contenido de esos archivos si no los nombrees como tal, estos son puros Txt pero los nombres de estos son numeros, osea puede existir en mi directorio archivos tales como:

Directorio "Datos" y dentro de el varios Txt como: 23425.txt, 43572.txt, 29834.txt, 87234.txt .....

- Esos Txt me lo genera de forma secuencial un Software de uso personal, ok una vez obtenidos deseo saber cual es el mayor porque me interesa trabajar con ese numero de archivo sumandole 1 osea que si el mayor es por ejemplo 345.txt necesito crear un archivo de nombre 346.txt, luego a este archivo necesito insertarle unos datos desde la misma aplicacion a traves de preguntas ya formuladas ingresando la respuesta desde un Input y tambien a traves de seleccion osea hacer la pregunta y tener un panel de opciones: 1- Respuesta A , 2- Respuesta B, 3- Respuesta C, creo que eso se llama Switch y al finalizar ese proceso no salir del programa si no que toooodo el ciclo se repita otra vez hasta que elusuario decida cerrar por si mismo la aplicacion.

- En lo que estuve buscando pude encontrar esto que lo modifique un poco a mi requerimiento.

Código (csharp) [Seleccionar]

String[] asFileNames = Directory.GetFiles(@"C:\datos\ ", "*.txt");
            int i;
            Console.WriteLine("archivos {0} en {1}",
                asFileNames.Length, Directory.GetCurrentDirectory());
            for (i = 0; i < asFileNames.Length; i++)
            {
                Console.WriteLine("{0} - {1}", i,
                    asFileNames[i]);
            }
            Console.Read();


- Problema uno es una aplicacion de CMD quiero algo mas amigable asi que intente adaptarlo aun mas pero no me funciono dado que cree una Aplicacion de Windows Forms y trate de insertar eso en un Label sin ningun resultado favorable ("Por cierto el anterior Codigo como aplicacion de CMD me corrio bien")... Intente hacerlo de esta forma dandome cuenta que no necesitaba parte del codigo:

Código (csharp) [Seleccionar]

private void label1_Click(object sender, EventArgs e)
        {
            String[] asFileNames = Directory.GetFiles(@"C:\datos\ ", "*.txt");
            int i;
            for (i = 0; i < asFileNames.Length; i++)
            {
                label1.Text = asFileNames[i].ToString();
            }
        }


- Intente cambiar el valor de i en asFileNames por un numero para ver si se imprimia el nombre del archivo en la posicion 2 por ejemplo igual no se mostraba nada. Lo curioso es que si intento lo mismo en un textBox pues si se imprime pero solo cuando presiono alguna tecla y no con asFileNames si no con asFileNames[1] o cualquier otro numero con el valor del arreglo en i el programa se cuelga.

- Problema dos ese codigo me devuelve el .txt la extension yo quiero solo el numero, se que lo mostre es una minuscula parte de lo que pido pero no he podido avanzar...

- Se que para crear el archivo es con

Código (csharp) [Seleccionar]

     System.IO.File.Create(@"C:\Temp.txt");


- Imagino que para sumar un numero a nombre del archivo debo contener ese nombre en una variable no se si eso se deba convertir a un tipo entero y luego sumarle un + 1 y para lo demas creo que seria:

Código (csharp) [Seleccionar]

System.IO.File.WriteAllText(@"C:\Users\Public\TestFolder\WriteText.txt", resp);


- Donde resp seria una variable que contenga la respuesta. Espero pueda ayudarme dado que tengo una vaga idea pero no se como o por donde comenzar y tengo dudas de porque el label no me muestra nada. Saludos...

Eleкtro

#1
Con la siguiente función basada en el manejo de LINQ, obtengo los archivos cuyo nombre de archivo sea numérico, y devuelvo una representación del archivo (type FileInfo) que tenga el número más grande.

Código (csharp) [Seleccionar]
using System.IO

Código (csharp) [Seleccionar]
public static FileInfo GetFileWithBiggestNumberInFilename(string dirpath, string ext) {

IEnumerable<FileInfo> files =
   from filepath in Directory.GetFiles(dirpath, string.Format("*{0}", ext), SearchOption.TopDirectoryOnly)
   select new FileInfo(filepath);

       int result = 0;

return (from file in files
where int.TryParse(Path.GetFileNameWithoutExtension(file.Name), out result)
orderby Convert.ToInt32(Path.GetFileNameWithoutExtension(file.Name)) descending
select file).FirstOrDefault();

}

( quizás quieras añadirle algún control de errores )

Despues, para crear un archivo incrementando el número del nombre del archivo que obtuvimos con la función de arriba, puedes hacerlo de la siguiente manera:
Código (csharp) [Seleccionar]
FileInfo file = GetFileWithBiggestNumberInFilename("C:\\", ".txt");
int number = Convert.ToInt32(Path.GetFileNameWithoutExtension(file.Name));
int newNumber = (number + 1);
string newFilepath = Path.Combine(file.DirectoryName, string.Format("{0}{1}", newNumber, file.Extension));

using (StreamWriter sw = new StreamWriter(newFilepath, false, Encoding.Default)) {

   sw.WriteLine("Hello World!");

}


Ahí también te mostré como utilizar el stream para escribir una linea de texto.

Saludos!








Slikp

- Gracias Elektro por el aporte, de verdad quiero aprender. Quizas estoy intentando correr antes que aprender a gatear, pero requiero realizar esto... Desmenuce tu codigo para intentar entender  como funciona capa parte y no lo entiendo del todo ni creo entenderlo al 50%. En el primer fragmento del codigo.

Código (csharp) [Seleccionar]

    public static FileInfo GetFileWithBiggestNumberInFilename(string dirpath, string ext) {
     
    IEnumerable<FileInfo> files =
        from filepath in Directory.GetFiles(dirpath, string.Format("*{0}", ext), SearchOption.TopDirectoryOnly)
        select new FileInfo(filepath);
     
            int result = 0;
     
    return (from file in files
    where int.TryParse(Path.GetFileNameWithoutExtension(file.Name), out result)
    orderby Convert.ToInt32(Path.GetFileNameWithoutExtension(file.Name)) descending
    select file).FirstOrDefault();
     
    }



- Creas una funcion de nombre "GetFileWithBiggestNumberInFilename" no ? y le pasas como argumento lo que esta dentro de su parentesis inicial no ?. Lo que no entiendo es a que hace referencia cada cosa... Como le digo a la funcion que quiero que lea los archivos de determinado documento? por ejemplo una carpeta llamada "Datos" y que se encuentre en Disco C. Tendria que reeplazar el "string dirpath" ? por algo asi como "string dirpath = @"C:\datos\";?.

- Ya vi que IEnumerable devuelve una colección enumerable de información de los archivos en el directorio actual de FileInfo. Y bueno con lo demas creo que contienes en "files" no se si devuelve un arerglo de los nombres de los archivos dado que creo que con Directory enumeras con GetFiles obtienes los archivos y con SearchOption te cercioras de que sea en el directorio indicado o actual. Lo que no entiendo es para que el.

Código (csharp) [Seleccionar]

int result = 0;

            return (from file in files
                    where int.TryParse(Path.GetFileNameWithoutExtension(file.Name), out result)
                    orderby Convert.ToInt32(Path.GetFileNameWithoutExtension(file.Name)) descending
                    select file).FirstOrDefault();


- Con eso le quitas la extensión al archivo? y donde se almacena el resultado? en Result ? Es en esa variable de tipo int donde se almacena el numero del archivo que necesito? en este caso el mayor?

- Lo otro si que no lo entendi casi nada.

Código (csharp) [Seleccionar]

    FileInfo file = GetFileWithBiggestNumberInFilename("C:\\", ".txt");
    int number = Convert.ToInt32(Path.GetFileNameWithoutExtension(file.Name));
    int newNumber = (number + 1);
    string newFilepath = Path.Combine(file.DirectoryName, string.Format("{0}{1}", newNumber, file.Extension));
     
    using (StreamWriter sw = new StreamWriter(newFilepath, false, Encoding.Default)) {
     
        sw.WriteLine("Hello World!");
     
    }


- Eso fue solo un ejemplo y tengo que ver la manera de como aplicarlo con relacion al primer codigo ? pregunto porque me imagino que se tiene que hacer referencia a "result" en algun lugar de este codigo o no?... Y bueno la verdad no se muy bien como aplicar todo el ejemplo en una aplicacion de Windows Forms y si quisiera mostrar el nombre del documento al que se le sumo "+1" en un label ?.

- Saludos...

Eleкtro

Cita de: Slikp en 30 Noviembre 2015, 21:18 PMLo que no entiendo es a que hace referencia cada cosa...

El primer argumento de la función es la ruta de directorio donde buscar archivos, y el segundo argumento determina el tipo de extensión (.txt).


Cita de: Slikp en 30 Noviembre 2015, 21:18 PMComo le digo a la funcion que quiero que lea los archivos de determinado documento? por ejemplo una carpeta llamada "Datos" y que se encuentre en Disco C

Pasándole como primer argumento dicho directorio:
Código (csharp) [Seleccionar]
ileInfo file = GetFileWithBiggestNumberInFilename("C:\\Datos", ".txt");


Cita de: Slikp en 30 Noviembre 2015, 21:18 PMTendria que reeplazar el "string dirpath" ? por algo asi como "string dirpath = @"C:\datos\";?.

Si no quieres utilizar una función, entonces si que debes modificar la variable dirpath para asignarle el directorio como has dicho.






Cita de: Slikp en 30 Noviembre 2015, 21:18 PMLo que no entiendo es para que el.

Código (csharp) [Seleccionar]
int result = 0;
...
where int.TryParse(Path.GetFileNameWithoutExtension(file.Name), out result)
...

La función int.TryParse sirve para intentar convertir un string a un número entero de 32 bits (int).


Cita de: Slikp en 30 Noviembre 2015, 21:18 PMdonde se almacena el resultado? en Result ? Es en esa variable de tipo int donde se almacena el numero del archivo que necesito? en este caso el mayor?

La variable result es usada para almacenar un valor booleano (true/false) que determina si la conversión a int de la función int.TryParse tuvo éxito. nada más.


Cita de: Slikp en 30 Noviembre 2015, 21:18 PMCon eso le quitas la extensión al archivo?

Con la función Path.GetFileNameWithoutExtension obtengo el nombre del archivo sin extensión, eso elimina la extensión y también la ruta de directorio dejando solamente el nombre de archivo ...pero esto es temporal simplemente para acondicionar la evaluación del primer argumento que toma la función int.TryParse, el por qué de esto es simple, si dejo la ruta de directorio y la extensión ".txt" obviamente ni lo uno ni lo otro se puede representar como un número, en cambio el nombre de archivo si, ya que dijiste que son nombres de archivo numéricos.

No se si me habrás entendido bien.






Cita de: Slikp en 30 Noviembre 2015, 21:18 PM- Eso fue solo un ejemplo y tengo que ver la manera de como aplicarlo con relacion al primer codigo ? pregunto porque me imagino que se tiene que hacer referencia a "result" en algun lugar de este codigo o no?...

No, no es ningún ejemplo que debas adaptar, lo único que debes adaptar son los argumentos que le pasas a la función GetFileWithBiggestNumberInFilename para indicar la ruta en donde quieres que se busquen los archivos y la extensión de archivo a buscar.

El código es completamente funcional, es una función de uso genérico, tú le indicas un directorio a la función y esta buscará el nombre de archivo numérico más grande y te devolverá una representación de ese archivo (contenido en el valor de retorno de la función), que es un objeto de tipo FileInfo.

El valor de retorno de dicha función ya se asigna a la variable file:
Citar
Código (csharp) [Seleccionar]
FileInfo file = GetFileWithBiggestNumberInFilename("C:\\", ".txt");

Olvida la variable result, eso simplemente es parte de la lógica del algoritmo utilizado para buscar/evaluar y devolverte el objeto FileInfo. El valor de retorno es lo que te debe interesar.






Cita de: Slikp en 30 Noviembre 2015, 21:18 PMy si quisiera mostrar el nombre del documento al que se le sumo "+1" en un label ?.

Tomando como referencia el código que te mostré, en el segundo bloque de código declaro la variable newFilepath la cual contiene la ruta completa del nuevo archivo a crear (con el número incrementado). Te lo dejé todo bien fácil, solo tienes que observar de nuevo el código para saber como obtener el nombre de archivo de una ruta completa, haciendo uso de la función Path.GetFileNameWithoutExtension(), Path.GetFileName(), o creando una instancia de la class FileInfo.

Ejemplo:
Código (csharp) [Seleccionar]
this.Label1.Text = Path.GetFileName(newFilepath);

o también:
Código (csharp) [Seleccionar]
this.Label1.Text = New FileInfo(newFilepath).Name;

Saludos








Eleкtro

Cita de: Slikp en 30 Noviembre 2015, 21:18 PMY bueno la verdad no se muy bien como aplicar todo el ejemplo en una aplicacion de Windows Forms y si quisiera mostrar el nombre del documento al que se le sumo "+1" en un label ?.

Hombre, no te lo voy a hacer todo. Creo haberte resuelto la parte importante del problema que podría resultarte más problemática y espero que ahora hayas podido entender como aplicarlo al código, de lo contrario, pregunta.

Sin saber muy bien como lo quieres hacer, el Form yo lo dejaría así:


Se trata de un Form con un label, un ListBox, y dos botones.

En el código del Form, solo tienes que iterar el archivo de texto que contiene las preguntas y respuestas (el cual tampoco se como está delimitado así que no puedo ponerte un ejemplo) y mostrar cada pregunta en el label, y las respuestas en el ListBox.

Pseudo-Ejemplo, con muchos comentarios para ayudarte a comprender todo a la primera :P:

( el foro da error al intentar publicar el código, así que te dejo un enlace )

http://pastebin.com/8yHJZara

Saludos