Как получить путь к папке / каталогу из ввода? - PullRequest
1 голос
/ 08 марта 2012

Как вы получаете последнюю папку / каталог из пользовательского ввода независимо от того, является ли ввод пути к папке или файлу?Это когда соответствующая папка / файл может не существовать.

C: \ Users \ Public \ Desktop \ workspace \ page0320.xml

C: \ Users \ Public \ Desktop\ workspace

Я пытаюсь извлечь папку «workspace» из обоих примеров, даже если папка «workspace» или файл «page0320.xml» не существует.

РЕДАКТИРОВАТЬ: Используя предложение BrokenGlass, я получил его на работу.

String path = @"C:\Users\Public\Desktop\workspace";
String path2 = @"C:\Users\Public\Desktop\workspace\";
String path3 = @"C:\Users\Public\Desktop\workspace\page0320.xml";

String fileName = path.Split(new char[] { '\\' }).Last<String>().Split(new char[] { '/' }).Last<String>();

if (fileName.Contains(".") == false)
{
    path += @"\";
}

path = Path.GetDirectoryName(path);

Вы можете заменить любую переменную пути, и на выходе будет:

C:\Users\Public\Desktop\workspace

Конечно,это работает при условии, что файлы имеют расширения.К счастью, это предположение работает для моих целей.

Спасибо всем.Был давним скрытником и новым постером.Это было действительно впечатляющим, насколько быстро и полезно были ответы: D

Ответы [ 5 ]

3 голосов
/ 08 марта 2012

use Path.GetDirectoryName:

string path = Path.GetDirectoryName(@"C:\Users\Public\Desktop\workspace\page0320.xml");

string path2 = Path.GetDirectoryName(@"C:\Users\Public\Desktop\workspace\");

Обратите внимание на обратную косую черту в пути, хотя во втором примере - в противном случае рабочее пространство будет интерпретироваться как имя файла.

1 голос
/ 08 марта 2012

Я буду использовать DirectoryInfo следующим образом:

DirectoryInfo dif = new DirectoryInfo(path);
if(dif.Exist == true)
    // Now we have a true directory because DirectoryInfo can't be fooled by 
    // existing file names.
else
    // Now we have a file or directory that doesn't exist.
    // But what we do with this info? The user input could be anything
    // and we cannot assume that is a file or a directory.
    // (page0320.xml could be also the name of a directory)
0 голосов
/ 08 марта 2012

Как уже говорилось ранее, на самом деле не существует выполнимого решения, но это также может помочь:

private string GetLastFolder(string path)
{
    //split the path into pieces by the \ character
    var parts = path.Split(new[] { Path.DirectorySeparatorChar, });

    //if the last part has an extension (is a file) return the one before the last
    if(Path.HasExtension(path))
        return parts[parts.Length - 2];

    //if the path has a trailing \ return the one before the last
    if(parts.Last() == "")
        return parts[parts.Length - 2];

    //if none of the above apply, return the last element
    return parts.Last();
}

Возможно, это не самое чистое решение, но оно будет работать.Надеюсь, это поможет!

0 голосов
/ 08 марта 2012

Если вы можете сделать некоторые предположения, то это довольно просто ..

Предположение 1: все файлы будут иметь расширение Предположение 2: содержащий каталог никогда не будет иметь расширение

If Not String.IsNullOrEmpty(Path.GetExtension(thePath))
  Return Path.GetDirectoryName(thePath)
Else
  Return Path.GetFileName(thePath)
End If
0 голосов
/ 08 марта 2012

Вы можете использовать GetFileName после GetDiretoryName из класса Path в пространстве имен System.IO.

GetDiretoryName получит путь без имени файла (C:\Users\Public\Desktop\workspace).GetFileName затем возвращает последнюю часть пути, как если бы это был файл без расширения (workspace).

Path.GetFileName(Path.GetDirectoryName(path));

РЕДАКТИРОВАТЬ: путь должен иметь конечный разделитель пути, чтобы этот пример работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...