StreamReader жалуется, что файл не существует, но он делает
У меня есть приложение, которое локализовано для использования по всей Европе.
У меня есть опция меню, которая загружает файл с диска.
Эта операция отлично работает на моей машине dev, но не работает на виртуальной машине, которую я использую для тестирования других операционных систем. Например, французский, испанский и т.д.
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);
}
Ответы
Ответ 1
Хорошо, нашел проблему.
Определено, что операционная система читает файл, отображаемый в проводнике, как "debug.txt" как "debug.txt.txt".
Это было определено с помощью вызова System.IO.Directory.GetFiles для отображения файлов в целевом каталоге.
Если я удалю расширение .txt, чтобы проводник Windows отображал его как "debug", тогда файл найден.
Оказывается, что проводник скрывал расширения файлов известных типов на целевой машине.
FYI ---------------------------------------------- ------------------
Откройте "Проводник", выберите "Инструменты" - "Параметры папки", затем вкладку "Вид".
Прокрутите вниз и снимите флажок "Скрыть расширения для известных типов файлов".
Ответ 2
Чтобы убедиться, что вы находитесь в правильной папке, посмотрите Environment.SpecialFolders
например.
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Затем также проверьте разрешения для конкретного файла.
Ответ 3
Я бы также попытался использовать
File.Exists()
перед тем, как открыть его. И небольшой совет - использовать
Path.Combine()
При объединении двух частей пути.
Ответ 4
Возможно, этот префикс неверен: C:\Program Files
Например, для бразильских португальских установок Windows эта папка становится "C:\Arquivos de Programas\"
; вы должны убедиться, что ваши установки Windows не имеют такой же "функции".
Если этот образец кода работает внутри этой папки, вы можете использовать относительный путь.
Вы также можете попробовать использовать ourPath = "%ProgramFiles%\MyCompany\MyTool\
Ответ 5
Возможно, это связано с исключением безопасности, поскольку текущий пользователь, пытающийся прочитать, не имеет достаточного разрешения. Я встречал это много раз....