2016-01-13 54 views
-4

我有一个路径字符串的一部分,完整路径:"\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"如何找到一个给定的“路径字符串的一部分”用C#

我想搜索在C以上的路径:与需要得到完整的目录的完整路径。

我试着用Path.GetFullPath("")和其他内置方法,但没有得到完整的完整路径。

+0

的[?我如何获得大会的代码在路径(可能的复制http://stackoverflow.com/questions/52797 /如何获得该程序集的代码是) – haddow64

+0

否...不是来自大会。以上部分字符串位于C驱动器的某个位置。现在我想识别相同的,并需要使用该部分字符串路径来检索完整的完整路径。 – venkat

+0

'path =“C:”+ path;'? –

回答

0

以下是代码: sourceDir将是完整路径。

string defaultFolder = System.AppDomain.CurrentDomain.BaseDirectory; 
    string navigateToFolder = "\\MVVM\\MyFirstTest2016\\MyFirstTest\\bin\\Debug\\MyFirstTest.exe"; 
    string sourceDir = Path.Combine(defaultFolder, navigateToFolder); 
+0

这是假设提供的路径是相对于当前进程而言可能不是 – MickyD

+0

同意Micky对此。路径应该位于同一个域中。 – Muks

0

这听起来像你的问题是类似于this问题。你有一个部分路径,但不知道它在这个驱动器上的位置。天真的做法如下。

你第一步将是在驱动器的根目录开始,并获得list of directories

string[] dirs = Directory.GetDirectories(@"c:\", "*"); 

然后你会检查是否有这些字符串匹配的根路径的第一个目录(MVVM)。如果是这样,你会进入该文件夹,并检查它是否包含下一个目录。如果确实如此,请检查下一个和下一个等,直到完成路径。

如果没有,你会遍历目录,并运行相同的逻辑:拿到目录,检查是否有匹配你的第一个文件夹等

所以有点伪代码如下所示:

string directoryPath = "\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe" 
string[] splitPath = directoryPath.split("\") 
check("c:\") 

public void check(string directory) 
    string[] directories = Directory.GetDirectories(@directory, "*") 
    if(checkDirectories(directories, splitPath)) 
     // Success! 
    else 
     for(string subDirectory : directories) 
      string newDirectory = Path.combine(directory, subDirectory) 
      check(newDirectory) 

public boolean checkDirectories(string[] directories, string[] splitPath) 
    // Horrible, but just for example - finding the file at the end 
    if(splitPath.size == 1) 
     // Get file list in current directory and check the last part of splitPath 
    if(directories.contains(splitPath[0]) 
     // Recursively call checkDirectories with the sub directories of this folder, an splitPath missing the first item. This can be done using Array.Copy(splitPath, 1, newArray, 0) 

很明显,这远不是可以运行的,但它应该给你基本的想法。我之前提到的另一个问题也有一个被接受的答案,这将有助于更多。

0

您可以迭代所有目录并检查子目录是否可用。

正常Directory.EnumerateDirectories可能会抛出一个UnauthorizedAccessException停止查找目录的过程。

因此,您可以编写自己的EnumerateDirectories,如下所示。

提供的示例将返回找到的文件夹。

void Main() 
{ 
    string path = @"temp\A\B"; 
    var parts = path.Split(new [] { Path.DirectorySeparatorChar }); 
    var rootPath = "c:\\"; 

    foreach(var result in DirectoryEx.EnumerateDirectories(rootPath, parts.First())) 
    { 
     var checkPath = Path.Combine(result, String.Join(""+Path.DirectorySeparatorChar, parts.Skip(1).ToArray())); 
     if (Directory.Exists(checkPath)) 
      Console.WriteLine("Found : " + checkPath); 
    } 
} 

public class DirectoryEx 
{ 
    public static IEnumerable<string> EnumerateDirectories(string dir, string name) 
    { 
     IEnumerable<string> dirs; 

     // yield return may not be used in try with catch. 
     try { dirs = Directory.GetDirectories(dir); } 
     catch(UnauthorizedAccessException) { yield break; } 

     foreach (var subdir in dirs) 
     { 
      if(Path.GetFileName(subdir).Equals(name, StringComparison.OrdinalIgnoreCase)) 
       yield return subdir; 

      foreach(var heir in EnumerateDirectories(subdir, name)) 
       yield return heir; 
     } 
    } 
} 

在我的情况的结果:

Found : c:\dev\temp\A\B 
Found : c:\Temp\A\B 
相关问题