如何使用C#从给定的“字符串路径的一部分”中找到完整路径

时间:2016-01-13 08:26:26

标签: c#

我是字符串路径的一部分:100

我想在C:中搜索上面的路径,并且需要获取目录的完整路径。

我尝试使用"\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"和其他内置方法,但没有获得完整的完整路径。

3 个答案:

答案 0 :(得分:0)

这是代码: sourceDir将是完整路径。

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

答案 1 :(得分: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)

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

答案 2 :(得分: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