Замена символов-разделителей в пути к файлу
Я разрабатываю веб-приложение на C# в VS 2008. Я позволяю пользователю выбрать входной файл, а затем сохраняю путь к файлу в строковой переменной. Тем не менее, он хранит этот путь как "C:\\folder\\..."
, Итак, мой вопрос, как мне преобразовать этот путь к файлу в один "\"?
Спасибо, ребята, за вашу помощь! Пожалуйста, прости меня, поскольку я новичок в разработке ASP.NET. Это больше моего кода в контексте. Сначала я хочу посмотреть, существует ли каталог. Я думаю, мне не нужно проверять это, если я проверяю, существует ли файл. Но это все равно должно работать правильно? И в настоящее время моя строковая переменная path не отображается так, как мне нужно. Я не уверен, как сформулировать это утверждение. В конце концов я хочу выполнить инструкцию ReadAllText (см. Последнюю строку).
protected void btnAppend_Click(object sender, EventArgs e)
{
string fullpath = Page.Request.PhysicalPath;
string fullPath2 = fullpath.Replace(@"\\", @"\");
if (!Directory.Exists(fullpath2))
{
string msg = "<h1>The upload path doesn't exist: {0}</h1>";
Response.Write(String.Format(msg, fullpath2));
Response.End();
}
string path = "@" + fullpath2 + uploadFile.PostedFile.FileName;
if (File.Exists(path))
{
// Create a file to write to.
try
{
StreamReader sr = new StreamReader(path);
string s = "";
while(sr.Peek() > 0)
s = sr.ReadLine();
sr.Close();
}
catch (IOException exc)
{
Console.WriteLine(exc.Message + "Cannot open file.");
return;
}
}
if (uploadFile.PostedFile.ContentLength > 0)
{
inputfile = System.IO.File.ReadAllText(path);
3 ответа
Для начала звоню fullpath.Replace()
ничего не делает для fullpath
; он возвращает новую строку. Кроме того, когда ваши строковые литералы содержат \ (обратную косую черту), вам нужно сообщить компилятору, что вы не пытаетесь использовать escape-последовательность:
fullpath = fullpath.Replace(@"\\", @"\");
@
означает "пожалуйста, относитесь к этой строке буквально (дословно)". Другими словами, "когда я говорю обратную косую черту, я имею в виду обратную косую черту!"
См. http://msdn.microsoft.com/en-us/library/362314fe.aspx.
Редактировать:
Как упоминал Лебле, вы вызываете Directory.Exists() по полному пути к файлу. Это не сработает; вам нужно извлечь часть каталога из пути. Попробуй это:
if (!Directory.Exists(Path.GetDirectoryName(fullpath)))
{
...
}
Вы уверены, что проблема в обратном слэше? Обратная косая черта - это escape-символ в строках, так что если вы добавляете его в строку, вы должны ввести его как "\\", а не "\". (если вы не используете @) Обратите внимание, что отладчик часто отображает строку так, как вы бы ее поместили в коде, с использованием escape-символов, а не прямой.
Согласно документации, Page.Request.PhysicalPath возвращает путь к указанному файлу, а не к каталогу. Directory.Exists имеет значение true, только если вы даете ему каталог, а не файл. File.Exists() возвращает true?
Возможно, вы захотите заменить его на Path.DirectorySeparatorChar, а не \ на тот случай, если ваш код может в конечном итоге работать на другой платформе за один день (mono.net позволяет запускать его на Linux или, возможно, более вероятно, что он может закончиться на какой-то странной мобильной платформе)