StreamReader жалуется, что файл не существует, но он есть

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

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

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

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

Он говорит: «Не удалось найти файл C: \ Program Files \ MyCompany \ MyTool \ bin \ Files \ debug.txt»

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

Имена каталогов в целевой (французской) операционной системе такие же, как и на машине разработчика.

Любые идеи?

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

person Kildareflare    schedule 27.01.2010    source источник
comment
Попробуйте использовать метод File.Exists, чтобы проверить, существует ли файл.   -  person Faisal    schedule 27.01.2010


Ответы (5)


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

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

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

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

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

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

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

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

person Kildareflare    schedule 27.01.2010
comment
Большое спасибо. У меня была аналогичная проблема с моим файлом config.json. Следуя вашему методу, обнаружил, что он читается как config.json.txt. - person Kaane Guji; 17.01.2021

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

e.g.

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

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

person ZombieSheep    schedule 27.01.2010
comment
К сожалению, я не могу использовать явную папку таким образом, поскольку конечный пользователь может установить приложение в другом месте. Вот почему я получаю путь к каталогу, в котором установлено приложение (см. Правка). Кроме того, я проверил, что папка называется Program Files на целевой машине. - person Kildareflare; 27.01.2010

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

File.Exists()

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

Path.Combine()

При совмещении 2-х частей пути.

person Shimrod    schedule 27.01.2010
comment
Будьте осторожны с Path.Combine, если есть вероятность того, что пользовательский ввод сделает это там: stackoverflow.com/q/53102/522859 - person Chris Owens; 09.08.2018
comment
Спасибо Крис, действительно может потребоваться чек! - person Shimrod; 13.08.2018

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

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

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

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

person Rubens Farias    schedule 27.01.2010

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

person chugh97    schedule 27.01.2010