#c# #class #methods #directory #filepath
#c# #класс #методы #каталог #путь к файлу
Вопрос:
свойства файла путь к файлу Я пытаюсь передать путь к моему файлу своему методу, чтобы я мог получить его текст. Я использую ту же структуру кода для примерно 10 других методов в том же проекте, и он работает правильно. Однако я отправляю правильный путь к своему методу, и каталог существует в location, он не может найти файл и открыть его, и появляется сообщение об ошибке. Я проверил все возможные синтаксические ошибки, но не смог найти ни одной, и это происходит только в одном классе проекта. Кто-нибудь может сказать мне, как исправить эту ошибку? Возможно, это ошибка Visual Studio, о которой я не знаю.
Вот пример одного из двух методов, которые не могут найти существующий файл:
public string ReadCourseInfoByID(string id)
{
string filepath = @"database\Courses\" id "\Info.txt" ;
//MessageBox.Show(filepath);
string dataline=" ";
if (!Directory.Exists(filepath))
{
MessageBox.Show("File not found!", "Error");
return dataline;
}
else
{
StreamReader InputFile;
InputFile = File.OpenText(filepath);
while (!InputFile.EndOfStream)
{
dataline= InputFile.ReadLine();
}
InputFile.Close();
return dataline;
}
}
Комментарии:
1. Какое сообщение об ошибке?
2. Обратите внимание, что это
@"database\Courses\"
будет буквально"database\Courses\"
, с 2
3. Путь, подобный тому, который вы показываете (
databaseCourses
), является относительным путем . Это означает, что он относится к любому текущему каталогу. Если текущий каталог отличается, то путь будет указывать на другое местоположение4. Я попробовал с одним «», но по-прежнему не находит существующий файл. Ошибка заключается в том, что каталог не найден, исключение, которое я использую, показывает окно сообщения «Файл не найден!»
5. Чтобы проверить реальный абсолютный путь, используйте что-то вроде
var absolutPath = Path.GetFullPath(filepath );
, это даст вам реальный путь.
Ответ №1:
Вы должны использовать File.Exists
not Directory.Exists
, чтобы проверить, существует ли файл.
if (!File.Exists(filepath))
{
MessageBox.Show("File not found!", "Error");
return dataline;
}
else...
Ответ №2:
Как прокомментировал Cid, вы используете дословную строку, обозначаемую префиксом @ вашей строки. Экранирующий символ для дословной строки — это не
но "
, что означает, что вам не нужно экранировать обратную косую черту, чтобы они были внутри вашей строки. Это превращает ваш текущий путь в это
string filepath = @"databaseCourses" id @"Info.txt"
Или, проще говоря, используя интерполяцию строк, это
string filepath = $@"databaseCourses{id}Info.txt"
Обратите внимание, что не рекомендуется выполнять конкатенацию пути к файлу вручную, как это. Вместо этого используйте путь.Комбинированный метод сделает это за вас. Это снова превращает ваш код в это
string filepath = Path.Combine("database", "Courses", id, "Info.txt");
Вот dotnetfiddle, демонстрирующий все это поведение. Обратите внимание, что пути не такие, как в системе Windows, но это связано с тем, как работает dotnetfiddle
Пожалуйста, также обратите внимание, что все эти пути к файлам являются относительными путями, то есть фактическое местоположение, на которое оно указывает, отличается в зависимости от того, где вы выполняете свое приложение. Если вы запустите его по C:Program Files
пути, он будет указывать на C:Program FilesdatabaseCourses{id}Info.txt
, но если вы запустите его в другом месте, например C:Temp
, путь на самом деле будет указывать на C:TempdatabaseCourses{id}Info.txt
Комментарии:
1. Я тоже попробовал метод объединения, и он дает мне точный правильный путь, но все равно не может найти файл, возможно, что-то не так в моем каталоге. Я опубликую новые снимки экрана моего свойства info file.
2. в любом случае, спасибо за ваш комментарий, я использовал этот способ для своего файла