Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: proview en 1 Marzo 2014, 16:55 pm



Título: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: proview en 1 Marzo 2014, 16:55 pm
Hola.

Tengo una duda a ver si podéis ayudarme:

He creado el juego pasapalabra en visual basic para un trabajo de clase, mi código se basa en leer un fichero diccionario junto con otro fichero que escribo las 26 definiciones del rosco del pasapalabra.

Entonces, trabajo con dos ficheros, uno de lectura y otro de escritura. En mi ordenador cuando creo el ejecutable el programa me funciona pero en otros ordenadores no funciona. ¿Cómo puedo hacer para que el juego funcione en cualquier ordenador?

He probado a añadir los ficheros en la carpeta resources del programa, añadiendo la ruta hacía los datos de dicha carpeta pero así también funciona solo en mi ordenador, también he probado poner my.resources.diccionario pero así no me reconoce la ruta.

Para leer ficheros y escribir utilizo este código:

Código
  1. Dim ruta As String = "E:\Ficheros\Diccionario1.txt"
  2. Dim sr As New System.IO.StreamReader(ruta, System.Text.UnicodeEncoding.Default)
  3. Dim texto As String
  4. texto = sr.ReadLine

Y para escritura:

Código
  1. Dim Archivo As System.IO.StreamWriter
  2. Archivo = My.Computer.FileSystem.OpenTextFileWriter(ruta, False) //Aquí la ruta del archivo de escritura que es distinto al de lectura

Es correcta esa forma? o para crear el instalador debo hacer algo más?

Un saludo.


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: Eleкtro en 1 Marzo 2014, 20:40 pm
Hola

Citar
Código
  1. Dim ruta As String = "E:\Ficheros\Diccionario1.txt"
Resulta obvio que, si el archivo no se encuentra en esa ruta absoluta (en todos y cada uno de los PC's que usen tu applicación), te va a dar error, ya que la ruta no existe...

Para solucionar el problema debes usar una ruta existente, puedes asignar la ruta hacia el directorio de inicio de la aplicación (es decir, la ruta apuntaría hacia la carpeta donde está tu exe compilado), y distribuir tu aplicación con el archivo de lectura 'Diccionario1.txt' añadido en esa misma carpeta, junto a tu exe, en el directorio de trabajo de la app.

Código
  1. Dim ruta As String = ".\Diccionario1.txt"

Te vendría bien leer lo siguiente:
· Application.StartupPath Property (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.startuppath%28v=vs.110%29.aspx)
· ¿como accedo al directorio raiz? (http://foro.elhacker.net/net/como_accedo_al_directorio_raiz-t407224.0.html;msg1913914#msg1913914)


Aparte de eso, hay una cosa que no me cuadra en tu duda, que tengas el archivo de texto como recurso pero que quieras utilizarlo especificando una ruta?, quizás me he perdido algo o entendí mal esa parte, pero si tienes el archivo ya añadido como recurso entonces resulta innecesario el uso de una ruta, de hecho no puedes, los recursos se utilizan como una Class con propiedades (Ej: Dim ContenidoDelArchivo as string = my.resources.diccionario.ToString), no como un archivo indicando una ruta.

· My.Resources Object (http://msdn.microsoft.com/en-us/library/6wkcc526.aspx)


Saludos!


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: proview en 2 Marzo 2014, 13:49 pm
Hola.

Muchas gracias por responderme y pasarme esos link,ya los leí pero no termino de aclararme con ellos.
Sobre la parte que no me entendiste quizás me explique mal.
A ver, cuando hice el código del programa la forma de leer los ficheros las tenía como rutas indicadas desde la carpeta de mi ordenador, pero cuando genere el instalador me dí cuenta que no funcionaba en otros ordenadores así que me puse a investigar y vi lo de introducir los ficheros en la carpeta resources y usar lo de my.resources."fichero".

Cuando uso solamente el my resocurce como me has dicho el programa no me funciona cuando lo ejecuto (creo porque no me lee el fichero de esa forma). También he puesto los ficheros en la carpeta de inicio de la aplicación indicando la ruta que me dijiste y al ejecutarlo en otro ordenador da error en la ruta.

Alguna otra idea? Seguramente hay algo que no hago bien o no hago pero no entiendo que puede ser.

Un saludo.
 


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: Eleкtro en 2 Marzo 2014, 14:58 pm
he puesto los ficheros en la carpeta de inicio de la aplicación indicando la ruta que me dijiste y al ejecutarlo en otro ordenador da error en la ruta.

Eso es técnicamente imposible, el primer lugar donde el SO intenta localizar una ruta relativa es en el directorio de trabajo actual, así que si tu tienes tu archivo junto al exe, y has modificado la ruta corréctamente (y suponiendo que no cambies el directorio de trabajo de la APP) debe funcionar.

Código
  1. Dim TextFile As String = ".\Archivo.txt"
  2. Dim TextContent As String = IO.File.ReadAllText(TextFile)
  3. Dim TextReader As New IO.StringReader(TextContent)
  4.  
  5. MessageBox.Show(TextReader.ReadLine)


Cuando uso solamente el my resocurce como me has dicho el programa no me funciona cuando lo ejecuto (creo porque no me lee el fichero de esa forma)

¿Pero has añadido el recurso desde las propiedades de tu proyecto?.

· Cómo: Agregar o quitar recursos (http://msdn.microsoft.com/es-es/library/3bka19x4%28v=vs.90%29.aspx)

Si símplemente copiar un archivo a la carpeta 'Resources' no consigues nada.

Y porfavor, cuando digas que "no me funciona" o "me da error", da los detalles completos del error que te muestra la IDE, no somos adivinos para saber lo que te está diciendo.


Saludos


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: proview en 2 Marzo 2014, 16:41 pm
Gracias.

Si, incluí los archivos desde las propiedades del proyecto.

A ver he hecho paso a paso el código que me has pasado y he compilado y guardado el ejecutable del programa. Lo he probado en una maquina virtual con Xp (aquí es donde estado probando y también en el ordenador de un compañero) y al instalarlo me ha dado un error que ponía que el archivo diccionario.txt no se encontraba en en una carpeta en la configuración local de xp,el error es este:

Código:
http://i58.tinypic.com/f0p24p.jpg
El texto cortado indica:

Citar
Código:
System.IO.FileNotFoundException: No se pudo encontrar el archivo 'C:\Documents and Settings\PRIMERO\Configuración local\Apps\2.0\X16CBQ9K.6OB\GRDP0DY2.Z7J\wind..tion_a7cd575c2b32d8ae_0001.0000_4d3315ddf5745775\Diccionario1.txt'.

He ido a la carpeta que indica y he copiado manualmente los archivos que uso y así si ha empezado a funcionar el juego.


No entiendo porque no se han copiado en ese directorio porque en teoría si no me equivocado en algo esta todo bien.
He guardado los  archivos desde propiedades en el recurso, también los tengo en la carpeta debug, en la carpeta final junto al exe también están,ya por último en plan desesperado los he copiado en todas las subcarpetas del programa para ver si tiraba,pero tampoco.


Una cosa que no entiendo, los ficheros están en la carpeta de recursos, si pincho en ellos sale unas propiedades:
Código:
http://i62.tinypic.com/314uik6.jpg
http://i62.tinypic.com/wb3qfc.jpg

De esas opciones he probado a poner compilacion y contenido y también dejarlo en ninguna.Las opciones hay que poner algunas o dejarlas como están?


Pd: En el error de la captura si le doy a continuar la aplicación se abre pero no ejecuta los métodos donde se lee el fichero y me va mostrando cada letra. Cuando copie manualmente los archivos en el directorio que indicaba al abrir la aplicación ya mostraba las cosas del fichero.

Un saludo.


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: Eleкtro en 2 Marzo 2014, 17:59 pm
Creo que tienes un tremendo lio montado

¿Porque tu programa intenta buscar el archivo en 'LOCALAPPDATA'?:

Citar
Código:
C:\Documents and Settings\PRIMERO\Configuración local\Apps\2.0\X16CBQ9K.6OB\GRDP0DY2.Z7J\wind..tion_a7cd575c2b32d8ae_0001.0000_4d3315ddf5745775\Diccionario1.txt'

Si quieres pásame una url de descarga del proyecto (por aqui o en privado) y le echo un vistazo al problema del archivo, aunque no te aseguro nada, nunca he echo un instalador en VS, no se si estás usando VSIX para hacer el instalador, o un install builder aparte, o que se yo, así que no se lo que me voy a encontrar xD.

EDITO: Lo de las 'Build actions' es para establecer la forma en como se debe trabajar el recurso (por ejemplo, embedirlo a la app), en tu caso deberías dejarlo como está, en 'None'.

· Resource Files (http://msdn.microsoft.com/en-us/library/cc296240%28v=vs.95%29.aspx)

+

Cita de: http://stackoverflow.com/questions/145752/what-are-the-various-build-action-settings-in-vs-net-project-properties-and-wh
   None: The file is not included in the project output group and is not compiled in the build process. An example is a text file that contains documentation, such as a Readme file.

    Compile: The file is compiled into the build output. This setting is used for code files.

    Content: Allows you to retrieve a file (in same dir as assembly) as a stream via Application.GetContentStream( uri ). For this method to work, it needs a AssemblyAssociatedContentFile custom attribute which VS graciously adds when you mark a file as "Content"

    Embedded resource: embeds the file in an exclusive assembly manifest resource.

    Resource (wpf only): embeds the file in a shared (by all files in the assembly with similar setting) assembly manifest resource named AppName.g.resources.

    Page (wpf only): Used to compile a xaml file into baml. The baml is then embedded with the same technique as Resource (i.e. available as `AppName.g.resources)

    ApplicationDefinition (wpf only): Mark the XAML/class file that defines your application. You specify the code-behind with the x:Class="Namespace.ClassName" and set the startup form/page with StartupUri="Window1.xaml"

    SplashScreen (wpf only): An image that is marked as SplashScreen is shown automatically when an WPF application loads, and then fades

    DesignData: unknown

    DesignDataWithDesignTimeCreatableTypes: unknown

    EntityDeploy: (Entity Framework): used to deploy the Entity Framework artifacts

    CodeAnalysisDictionary: A xml file containing custom word dictionary for spelling rules


Saludos!



Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: proview en 2 Marzo 2014, 18:08 pm
No tengo ni idea de porque busca el archivo ahí. Oks lo documento un poco y te lo mando por privado.

Muchas gracias.


Título: Re: Ayuda,Incluir ficheros de texto en instalador visual basic .
Publicado por: Eleкtro en 2 Marzo 2014, 20:44 pm
Te vas a reir, pero a mi me funciona perféctamente tu programa, el archivo de lectura ...se lee xD, no ha sido necesario efectuarle ninguna modificación para que me funcione.

¿Has probado tu app en una VM?, debería funcionar.

De todas formas tenías el archivo 'Diccionario1.txt' desperdigado en varias carpetas, lo único que he echo ha sido dejarlo únicamente como recurso y modificar las órdenes para leer el recurso en los 2 métodos que intentaban leer un archivo local, en fín lo tienes en la carpeta .\WindowsApplication7\Resources


Es probable que lo que a ti te sucede sea un problema de VisualStudio (algo que no se ha actualizado corréctamente en el proyecto) o de la configuración de la App, si con la simple modificación que hice sigue sin funcionarte entonces prueba a hacer lo siguiente:

1. Eliminar el archivo oculto de opciones ("WindowsApplication7.suo") que está en la carpeta raiz de la solución.  (verás otro archivo SUO, ese lo ha generado mi VS 2012)
2. Limpiar la solución y reconstruirla (En las opciones de VS, el botón 'Clean solution', y 'Rebuild')
3. Eliminar el directorio que comentaste, me da muy mala espina porque estoy casi convencido de que tiene algo que ver con todo esto y quizás es lo que te está causando el problema:
C:\Documents and Settings\PRIMERO\Configuración local\Apps\2.0\X16CBQ9K.6OB\GRDP0DY2.Z7J
(no se que habrá dentro del directorio, quizás prefieras hacer un backup antes de elimiar).


PD: Hay muchas cosas que podrías mejorar en el código (demasiadas), y también me fijé que tenías un bug (al cerrar el Form1.vb la aplicación seguía activa sin cerrarse y había que matarla o detener el debugger), lo he corregido.

Saludos