2010-04-14 2 views
4

Я разрабатываю веб-приложение C# в VS 2008. Я позволяю пользователю выбирать входной файл, а затем я сохраняю путь к файлу в строковой переменной. Однако он сохраняет этот путь как "C:\\folder\\...". Итак, мой вопрос заключается в том, как преобразовать этот путь в один «\»?Замена символов разделителя в пути к файлу

Спасибо, ребята, за все ваши помощь! Пожалуйста, простите меня, поскольку я новичок в разработке ASP.NET. Это скорее мой код в контексте. Сначала я хочу посмотреть, существует ли каталог. Я думаю, мне не нужно проверять это, если я проверю, существует ли файл. Но это все равно должно работать правильно? И в настоящее время моя строковая переменная «путь» не отображается так, как мне это нужно. Я не уверен, как сформулировать это утверждение. В конце концов я хочу выполнить инструкцию 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); 
+0

С точки зрения безопасности это выглядит довольно опасно. Вы разрешаете пользователю определять местоположение и/или имя файла для их загрузки на сервер ??? –

+0

Хорошая точка, Hightech, но цель моего веб-приложения заключается в том, чтобы пользователь мог сопоставлять столбцы из выбранного входного файла с столбцами из выбранной базы данных Adventureworks и добавлять эти входные записи в выбранную таблицу. Есть ли более безопасный способ сделать это? – salvationishere

ответ

5

Для начала вызова fullpath.Replace() ничего не делает fullpath; он возвращает новую строку. Кроме того, когда ваши строковые литералы имеют \ (обратная косая черта) в них, вы должны сообщить компилятору, что вы не пытается использовать последовательность эвакуации:

fullpath = fullpath.Replace(@"\\", @"\"); 

@ означает «пожалуйста обработайте эту строку буквально (дословно) ». Другими словами, «когда я говорю обратную косую черту, я означает обратная косая черта!»

См. http://msdn.microsoft.com/en-us/library/362314fe.aspx.

Edit:

Как уже упоминалось LeBleu, вы вызываете Directory.Exists() на полный путь файла. Это не сработает; вам нужно извлечь часть каталога из пути. Попробуйте это:

if (!Directory.Exists(Path.GetDirectoryName(fullpath))) 
{ 
    ... 
} 
+0

Спасибо, Чарлз, но когда я пробую это в окне «Часы», он все еще показывает двойную «\». Другими словами, это ничего не заменяет. – salvationishere

+1

Поместите код, который вы используете сейчас, в свой вопрос.Код в моем примере определенно конвертирует обратную косую черту в однократную обратную косую черту. –

+0

Чарльз, я не уверен, что понимаю ваше объяснение здесь. Тем не менее, я обновил свой вопрос, поэтому, возможно, вы увидите, чего я в конечном итоге пытаюсь достичь. – salvationishere

0

Вы можете рассмотреть вопрос о замене его на Path.DirectorySeparatorChar, а не \ на offchance, что ваш код может в конечном итоге работает на другой платформе один день (mono.net позволяет ему запускать на Linux или, возможно, более вероятно, это может в конечном итоге на некоторых Wierd мобильной платформе)

+0

, но тогда у него не было бы причин беспокоиться о косе, нет? – jcolebrand

+0

Спасибо, ребята, за все ваши помощь! Я решил свою проблему. Все, что я сделал, было удалено символом «@», чтобы мой путь к файлу обрабатывал «\\» как «\»! Простой, хе-хе? – salvationishere

6

Вы уверены, что проблема является обратная косая черта? Обратная косая черта - это символ escape в строках, так что если вы добавляете его в строку, вы должны ввести его как «\\», а не «\». (если вы не используете @). Обратите внимание, что отладчик часто отображает строку так, как вы бы поместили ее в код, с escape-символами, а не напрямую.

В соответствии с documentation, Page.Request.PhysicalPath возвращает путь к определенному файлу, в котором вы находитесь, а не к каталогу. Directory.Exists является правдой только если вы дадите ему каталог, а не файл. Возвращает ли File.Exists() true?

Смежные вопросы