Замена символов-разделителей в пути к файлу

Я разрабатываю веб-приложение на 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 или, возможно, более вероятно, что он может закончиться на какой-то странной мобильной платформе)

Другие вопросы по тегам