StreamReader жалуется, что файл не существует, но он есть - PullRequest
12 голосов
/ 27 января 2010

У меня есть приложение, которое локализовано для использования по всей Европе.

У меня есть пункт меню, который загружает файл с диска.

Эта операция отлично работает на моем компьютере разработчика, но не работает на виртуальной машине, которую я использую для тестирования других операционных систем, например, французского, испанского и т. Д.

FileNotFoundException генерируется, когда StreamReader пытается открыть файл.

Там написано "Не удалось найти файл C: \ Program Files \ MyCompany \ MyTool \ bin \ Files \ debug.txt '"

Дело в том, что файл существует, в правильном месте и с правильным именем файла.

Имена каталогов в целевой (французской) операционной системе совпадают с именами машины dev.

Есть идеи?

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);
        }

Ответы [ 5 ]

29 голосов
/ 27 января 2010

ОК, нашел проблему.

Определено, что операционная система считывает файл, отображаемый в проводнике, как «debug.txt» как «debug.txt.txt».

Это было определено с помощью вызова System.IO.Directory.GetFiles для вывода списка файлов в целевом каталоге.

Если я удаляю расширение .txt, чтобы проводник Windows отображал его как «отладочный», файл будет найден.

Оказывается, проводник скрывал расширения файлов известных типов на целевой машине.

К вашему сведению ---------------------------------------------- ------------------

Откройте проводник, выберите «Инструменты» -> «Свойства папки», затем вкладку «Просмотр».

Прокрутите вниз и снимите флажок «Скрыть расширения для известных типов файлов».

5 голосов
/ 27 января 2010

Чтобы убедиться, что вы находитесь в правильной папке, посмотрите на Environment.SpecialFolders

, например

string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);

Затем также проверьте разрешения для конкретного файла.

4 голосов
/ 27 января 2010

Я бы тоже попробовал использовать

File.Exists()

перед открытием. И маленький совет, чтобы использовать

Path.Combine()

При объединении 2 частей пути.

1 голос
/ 27 января 2010

Это может быть связано с исключением безопасности, поскольку текущий пользователь, пытающийся читать, не имеет достаточных разрешений. Я сталкивался с этим много раз ....

1 голос
/ 27 января 2010

Может быть, этот префикс неправильный: C:\Program Files

Например, для бразильских португальских установок Windows эта папка становится "C:\Arquivos de Programas\"; Вы должны убедиться, что ваши установки Windows не имеют такой же "функции".

Если этот пример кода выполняется внутри этой папки, вы можете использовать относительный путь.

Вы также можете попробовать использовать ourPath = "%ProgramFiles%\MyCompany\MyTool\

...