2014-09-21 5 views
1

Function ниже я написал, чтобы проверить, существует ли путь File/Directory. Рядом есть RecentPath, который извлекает последний путь, который был проверен Function.Почему функция выводит неправильное значение?

private static String IRecentPath; 
    public static String RecentPath 
    { 
     get 
     { 
      return IRecentPath; 
     } 
    } 

    public static Boolean Exists(String Path, Int32 PathType = 0) 
    { 
     return Exist(Path, PathType); 
    } 

    internal static Boolean Exist(String Path, Int32 PathType = 0) 
    { 
     Boolean Report = false; 
     switch (PathType) 
     { 
      case 0: 
       Report = (Directory.Exists(Path) || File.Exists(Path)); 
       IRecentPath = Path; 
       break; 
      case 1: 
       String MPath = AppDomain.CurrentDomain.BaseDirectory; 
       Report = (Directory.Exists(System.IO.Path.Combine(MPath, Path)) || File.Exists(System.IO.Path.Combine(MPath, Path))); 
       IRecentPath = System.IO.Path.Combine(MPath, Path); 
       break; 
      case 2: 
       String LPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 
       Report = (Directory.Exists(System.IO.Path.Combine(LPath, Path)) || File.Exists(System.IO.Path.Combine(LPath, Path))); 
       IRecentPath = System.IO.Path.Combine(LPath, Path); 
       break; 
      default: 
       break; 
     } 
     return Report; 
    } 

Проблема заключается в том, что RecentPath всегда возвращает путь, который был установлен при вызове функции, а не конечный путь.

Пример:

Допустим, что мне нужно, чтобы проверить /user каталог существует в myDocument, а затем получить последний недавний путь, который был проверен, так:

Path.Exists("/user", 2); 
MessageBox.Show(Path.RecentPath); 

Выход должен быть C:\Users\Hossam\Documents\user\ но вместо этого это всего лишь /user.

ответ

3

Червь (/) в начале строки ввода, по-видимому, мешает Path.Combine(). Попробуйте это:

Path.Exists("user", 2); 
MessageBox.Show(Path.RecentPath); 

Выход: C:\Users\Hossam\Documents\user

+0

бога ооо вот это (Y) спасибо. – Enumy

+2

«Интерферирует» может быть неправильным для этого. Это в основном работает IO.Path.Combine - он видит, что второй аргумент начинается с разделителя, по-видимому, предполагает, что он уже находится в корне, и просто выводит второй путь. См. [MSDN] (http://msdn.microsoft.com/en-us/library/fyy7a5kt%28v=vs.110%29.aspx) для некоторых деталей. – Andrei

+0

@ Andrei Я знаю, что это нужно, и поэтому мне никогда не приходило в голову, что это проблема, но почему-то, когда я использовал только «пользователь», он работал нормально !!? – Enumy

3

Это происходит потому, что вы передаете строку, которая начинается с косой черты.
В системах Windows, это AltDirectorySeparatorChar

В Path.Combine документы вы можете прочитать это замечание

Если path2 не включает в себя корень (например, если path2 не запускается с символом разделителя или спецификация привода), результатом является конкатенация двух путей с промежуточным разделителем . Если path2 содержит корень, возвращается путь2.

Теперь, глядя на исходный код Path.Combine вы могли видеть

..... 
if (IsPathRooted(path2)) 
{ 
    return path2; 
} 
.... 

и конечно IsPathRooted содержит

..... 
if (path[0] == AltDirectorySeparatorChar) 
{ 
    return true; 
} 
..... 
Смежные вопросы