#c# #filepath
#c# #путь к файлу
Вопрос:
Я несколько раз проверял, что файл существует, и когда я копирую и вставляю путь к файлу из кода в проводник Windows, он работает. Это приводит меня к файлу. Поэтому, пожалуйста, помогите, что происходит? Сообщение об исключении для вашей справки гласит
System.IO.FileNotFoundException: не удалось найти файл «/C:UsersDanielDesktopCouryahproducts_export.csv
Почему перед ним стоит косая черта? Это виновник? Как мне это исправить?
public void PopulateList()
{
string line;
System.IO.StreamReader file = new System.IO.StreamReader("C:\Users\Daniel\Desktop\Couryah\products_export.csv");
while ((line = file.ReadLine()) != null)
{
Product newProduct = new Product();
newProduct.setAll(line.Split(',')[1], line.Split(',')[3], Convert.ToDouble(line.Split(',')[19].Replace("$", "")), line.Split(',')[24]);
productList.Add(newProduct);
}
}
Комментарии:
1. Можете ли вы попробовать взять эту часть строки: r(«C:\ , удалить ее, затем повторно ввести и посмотреть, решит ли это вашу проблему? Не копируйте / не вырезайте, а затем вставляйте его, выделяйте, удаляйте, а затем повторно вводите. (Извините, но markdown ведет себя глупо и не позволяет мне форматировать строку как код из-за двойной обратной косой черты или еще чего-то). Мне интересно, есть ли у вас там скрытый символ, который может храниться в вашем файле .cs, скомпилированный в код, но не видимый в редакторе.
2. Другой способ получить правильный путь к файлу — это щелкнуть правой кнопкой мыши по файлу в проводнике и выбрать «Копировать как путь» и вставить это в код. Префикс файла с помощью @, чтобы не нужно было экранировать обратные знаки, @»path with backslashes».
3. Спасибо за отзыв. Я попытался сделать именно то, что вы сказали, как вы сказали, и, к сожалению, я получаю ту же ошибку со вставленной косой чертой в сообщении об исключении, что и выше. Любые другие предложения? Кроме того, «Shift щелчок правой кнопкой мыши» просто делает то же самое, что и «Щелчок правой кнопкой мыши» на моем компьютере, без опции «Копировать как путь»
4. Ваш точный код и путь, указанный вашим исключением, не совпадают. Опять же, не могли бы вы опубликовать свой точный код? Если есть какое-то странное сопоставление для локалей, из-за которого «Couryah» означает «Загрузить», можете ли вы хотя бы сказать нам, почему в вашем исходном исключении использовалось «Couryah», где в вашем комментарии указано «Загрузки»?
5. Кроме того, вы можете захотеть
Split
line
использовать один раз вместо 4 раз.
Ответ №1:
Я бы предварительно проверил, чтобы убедиться, что файл существует. Поместите в переменную, чтобы убедиться, что нет ложного / фиктивного значения с плохой косой чертой. Затем проверьте, существует ли файл или нет, для подтверждения ПЕРЕД открытием.
Затем, вместо потока, я просто изменил на файл.ReadAllLines(), который считывает каждую строку за раз в массив.
public void PopulateList()
{
var whatFile = "C:\Users\Daniel\Desktop\Couryah\products_export.csv";
if ( ! System.IO.File.Exists( whatFile ))
{
MessageBox.Show("No such file: " whatFile);
return;
}
foreach( var line in System.IO.File.ReadAllLines( whatFile ))
{
Product newProduct = new Product();
newProduct.setAll(line.Split(',')[1], line.Split(',')[3], Convert.ToDouble(line.Split(',')[19].Replace("$", "")), line.Split(',')[24]);
productList.Add(newProduct);
}
}
Теперь, это не обязательно отвечает, почему файл не существует, но вот одна вещь, с которой я специально столкнулся и ломал голову. У меня было подобное для клиента. У меня на рабочем столе был файл в формате csv, но, несмотря ни на что, была такая же проблема.
На самом деле я нашел файл «MyFile.csv», который на САМОМ деле был «MyFile.csv.txt «. Интересно, что… В итоге я перешел в командную строку DOS, изменил на папку и сделал КАТАЛОГ этой папки, чтобы увидеть его.
Оказывается, Windows любит по умолчанию СКРЫВАТЬ СУФФИКС ИМЕНИ ФАЙЛА общих расширений файлов. Итак, несмотря на то, что на рабочем столе был файл .csv, поскольку .txt был скрыт, вызывал файл not found . Для подтверждения я изменил файловый менеджер, чтобы НЕ СКРЫВАТЬ суффикс имени файла. Конечно же, удалил .txt и все заработало.
Не говорю, что это то, что у вас есть, но иногда очевидного нет.
Еще одно замечание. Я бы поставил точку останова в вашем отладчике, чтобы остановиться в момент проверки файла. Затем используйте окно просмотра и посмотрите, какие переменные, а также проверьте / измените по мере необходимости, чтобы подтвердить, что он выполняет то, что вы думали, что он должен.
Один дополнительный параметр…
Попробуйте использовать то, что WINDOWS считает вашим рабочим столом.
var whatFile2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Couryah\products_export.csv")
Как ЭТО «Специальная папка.Рабочий стол» сравните с вашим C:users …
Комментарии:
1. Я пытался проверить наличие скрытого суффикса, его нет. Реализуя ваше вышеупомянутое решение, я по-прежнему получаю путь, который обрабатывается как имеющий косую черту перед началом пути (как показано выше в верхней части вопроса под заголовком); Независимо от того, использую ли я @ для экранирования обратной косой черты, или если я использую двойные обратные косые черты, независимо от того, как я используюпрочитайте строки файла. Это действует так, как будто я неправильно ввожу путь и набираю косую черту, но это определенно не так.
2. @user2996871, понял, просто пытаюсь предложить что-то нестандартное.
3. Я знаю, я ценю это. Любые другие предложения, которые вы можете предложить, я хотел бы услышать
4. @user2996871, последняя мысль, и я видел похожие запутанные вещи в сетях, которые управляли профилями пользователей в других сетевых расположениях, чем вы могли бы подумать. См. Контекст в конце ответа относительно специальной папки. Для рабочего стола. Дает ли это другую папку, чем вы пытаетесь?
5. Это путь, который я получаю сейчас, дословно «/data/user/0/com.companyname. Couryah_Demo1/files/Desktop/Couryahproducts_export.csv».