StreamReader se queja de que el archivo no existe, pero lo hace
-
23-09-2019 - |
Pregunta
Tengo una aplicación localizada para su uso en toda Europa.
Tengo una opción de menú que carga un archivo desde el disco.
Esta operación funciona bien en mi máquina de desarrollo pero no funciona en la máquina virtual que utilizo para probar otros sistemas operativos _ por ejemplo, francés, español, etc.
Se genera una FileNotFoundException cuando el StreamReader intenta abrir el archivo.
Dice "'no pudo encontrar el archivo c: archivos de programa myCompany mytool bin files debug.txt'"
La cosa es que el archivo existe, en la ubicación correcta y con el nombre de archivo correcto.
Los nombres de directorio en el sistema operativo objetivo (francés) son los mismos que la máquina Dev.
¿Algunas ideas?
string ourPath = System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName);
try
{
System.IO.StreamReader sr = System.IO.File.OpenText(ourPath + @"\bin\Files\debug.txt");
string input = null;
while ((input = sr.ReadLine()) != null)
{
m_text.Append(input);
}
sr.Close();
}
catch (System.IO.FileNotFoundException)
{
MessageBox.Show("LoadDebugOptions: File Not Found: " + ex.Message);
}
Solución
Ok encontré el problema.
Determinado que el sistema operativo estaba leyendo el archivo que se muestra en Explorer como "debug.txt" como "debug.txt.txt".
Esto se determinó mediante el uso de una llamada a System.io.Directory.getFiles para enumerar los archivos en el directorio de destino.
Si elimino la extensión .txt para que Windows Explorer lo muestre como "depuración", entonces se encuentra el archivo.
Resulta que Explorer estaba ocultando extensiones de archivos de tipos conocidos en la máquina de destino.
FYI ------------------------------------------------- ---------------
Abra Explorer, seleccione Herramientas-> Opciones de carpeta y luego la pestaña Ver.
Desplácese hacia abajo y desmarque "Ocultar extensiones para los tipos de archivos conocidos".
Otros consejos
Para asegurarse de que esté en la carpeta correcta, mire Environment.SpecialFolders
p.ej
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Luego, también verifique los permisos en el archivo específico.
También intentaría usar
File.Exists()
antes de abrirlo. Y un pequeño consejo es usar
Path.Combine()
Al combinar 2 partes de un camino.
Tal vez ese prefijo está mal: C:\Program Files
Por ejemplo, para las instalaciones brasileñas de Windows portugués esa carpeta se convierte en "C:\Arquivos de Programas\"
; Debe asegurarse de que sus instalaciones de Windows no tengan la misma "función".
Si ese código de muestra se ejecuta dentro de esa carpeta, puede usar una ruta relativa.
También podrías intentar usar ourPath = "%ProgramFiles%\MyCompany\MyTool\
Puede deberse a la excepción de seguridad ya que el usuario actual que intenta leer no tiene suficiente permiso. Me he encontrado con eso muchas veces ...