StreamReader жалуется, что файла не существует, но он делает
-
23-09-2019 - |
Вопрос
У меня есть приложение, которое локализовано для использования по всей Европе.
У меня есть параметр меню, который загружает файл с диска.
Эта операция отлично работает на моей Dev Machine, но не работает на виртуальной машине, которую я использую для тестирования других операционных систем _ Например, французский, испанский и т. Д.
FilenotFoundException генерируется, когда StreamReader пытается открыть файл.
В нем говорится: «Не удалось найти файл c: program files mycompany mytool bin files debug.txt '»
Дело в том, что файл существует, в правильном месте и с правильным именем файла.
Названия каталогов в операционной системе Target (французский) такие же, как у машины 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);
}
Решение
ОК нашел проблему.
Определил, что операционная система читала файл, отображаемый в Explorer как «debug.txt» как «debug.txt.txt».
Это было определено с помощью вызова System.io.directory.getFiles для перечисления файлов в целевом каталоге.
Если я удалю расширение .txt, так что Windows Explorer отображает его как «отладку», то файл найден.
Оказывается, Explorer скрывал расширения файлов известных типов на целевой машине.
К вашему сведению ------------------------------------------------- ---------------
Откройте Explorer, выберите «Инструменты»> «Параметры папки», затем вкладка «Просмотр».
Прокрутите вниз и снимите «скрыть расширения для известных типов файлов».
Другие советы
Чтобы убедиться, что вы находитесь в правильной папке, посмотрите на Environment.SpecialFolders
например
string path = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
Затем также проверьте разрешения в конкретном файле.
Я бы также попытался использовать
File.Exists()
Прежде чем открыть это. И небольшой совет - использовать
Path.Combine()
При объединении 2 частей пути.
Может быть, этот префикс неверен: C:\Program Files
Например, для бразильских португальских установок Windows эта папка становится "C:\Arquivos de Programas\"
; Вы должны убедиться, что ваши установки Windows не имеют такой же «функции».
Если этот пример кода работает внутри этой папки, вы можете использовать относительный путь.
Вы также можете попробовать использовать ourPath = "%ProgramFiles%\MyCompany\MyTool\
Это может быть связано с исключением безопасности, поскольку текущий пользователь, пытающийся прочитать, не имеет достаточного разрешения. Я сталкивался с этим много раз ....