2017-02-13 11 views
0

Пример:Как проверить, если путь содержит, по меньшей мере, одна папка C#

File Paths:   | Output: 
----------------------------- 
C:\Abc\foo.txt  | true 
C:\Abc\foo\bar.txt | true 
C:\nodir.txt  | false 
E:\nodir.txt  | false 
C:\Abc\    | true 
C:\Abc\def   | true 

Как найти, если данный путь содержит, по меньшей мере, одну папку (excluding the main drive folder like C:\) в данном пути.

В настоящее время я собираюсь посмотреть, могу ли я разделить на \ и увидеть, что он содержит несколько элементов. Есть ли элегантное решение для этого?

+0

Если вы действительно хотите проверить путь, а не разобрать строку и использовать File.Exists, посмотрите на это решение: [Как быстро проверить, если папка пусто (.NET)?] (http://stackoverflow.com/a/954837/6741868) –

+2

Просто FYI, ваши последние два случая, возможно, неверны. Вы можете * иметь папку с именем 'nodir.txt' – Rob

+0

@Rob, спасибо, что указали это. Я думаю, что это может быть исправлено путем проверки 'FileAttributes.Directory' – Reddy

ответ

1

По моему комментарию, нет никакого способа, чтобы быть уверен для случаев как C:\nodir.txt потому что это может быть либо файл или папку.

bool CheckIt(string path) 
{ 
    IEnumerable<string> pathItems = path.Split(Path.DirectorySeparatorChar); 

    var isFile = System.IO.File.Exists(path); 
    if (isFile) 
     pathItems = pathItems.Skip(1); 

    if (Path.IsPathRooted(path)) 
     pathItems = pathItems.Skip(1); 

    return pathItems.Any(); 
} 

Это обеспечит правильный ответ предполагая пути, данные на самом деле существуют в системе.

Если вы хотите работать независимо от того, существуют файлы, вы должны сделать предположение о том, что путь заканчивается расширением является файл, не папку. В этом случае, вы бы обновить метод с:

var isFile = Path.GetFileNameWithoutExtension(path) != Path.GetFileName(path); 
+0

Да, Роб, мне нужно исправить это, добавив 'Path is directory or not'. Если вы добавите оба ответа, я могу отметить его ответ, чтобы он был полезен другим людям, у которых может быть другой выбор. – Reddy

+0

Я обновил вопрос, хочу, чтобы он работал, даже если файл не существует (упрощает тестирование:)) – Reddy

+0

@Reddy Последняя часть моего ответа обрабатывает ситуацию, когда она не заботится о файловой системе, однако в этом случае нам нужно сделать некоторые предположения. – Rob

0

Это может сделать трюк для вас

if((test.Split('\\').Length - 1)>=2) 
{ 
    //You have more than one folder 
} 
else 
{ 
    //One file no folder 
} 

Другая идея может быть

class Program 
{ 
    static void Main() 
    { 
     if(TextTool.CountStringOccurrences(Filetest, "\\")>=2) 
     { 
      //You have more than one folder 
     } 
     else 
     { 
      //One file no folder 
     } 
    } 
} 

public static class TextTool 
{ 
    public static int CountStringOccurrences(string text, string pattern) 
    { 
     // Loop through all instances of the string 'text'. 
     int count = 0; 
     int i = 0; 
     while ((i = text.IndexOf(pattern, i)) != -1) 
     { 
      i += pattern.Length; 
      count++; 
     } 
     return count; 
    } 
} 
+0

Не прочитал последнюю строку. B4 отправляет последнюю строку. : D –

1

Я надеюсь, что это поможет вам: - Directory.GetParent воля дает Directrory информацию родительской папки из Данный путь. если его родительский элемент равен null, это означает, что он находится в корневом каталоге, иначе он будет подпапкой под корнем.

public bool myMethod(string currentPath) 
{ 
    DirectoryInfo currentParent = Directory.GetParent(@"E:\nodir.txt"); 
    if (currentParent.Parent != null) 
    { 
     // if current parent is root means Parent will be null 
     return true; 
    } 
    return false; 
} 
2

Другой вариант:

private bool PathHasAtLeastOneFolder(string path) 
{ 
    return Path.GetPathRoot(path).Length < Path.GetDirectoryName(path).Length; 
} 
+1

Кратко, к сожалению, не выполняется для случая 'E: \ Abc '. Не уверен, что это проблема для OP. – Rob

+0

Если данный путь * является * корневым диском (то есть '' C: \ "'), 'Path.GetDirectoryName' вернет null, вызывая' .Length', чтобы выбросить NRE. – Abion47

0

Использование LINQ для подсчета вхождений символа обратной косой (\) характера может быть проще реализовать и даст лучше производительность, чем Split:

var isRoot = myString.Count(c => c == '\\') > 1; 
0

Вы можете проверить, если родитель на пути является корневым диском:

public bool DoesPathContainFolders(string path) 
{ 
    // Double check in case the given path *is* a root drive. 
    string parent = Path.GetDirectoryName(path); 
    return parent != null && parent != Path.GetPathRoot(path); 
} 

Или альтернативный подход:

public bool DoesPathContainFolders(string path) 
{ 
    // Double check in case the given path *is* a root drive. 
    string parent = Path.GetDirectoryName(path); 
    return parent != null && Path.GetDirectoryName(parent) != null; 
} 

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

  • Нет связанных вопросов^_^