我有一个路径字符串的一部分,完整路径:"\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"
如何找到一个给定的“路径字符串的一部分”用C#
我想搜索在C以上的路径:与需要得到完整的目录的完整路径。
我试着用Path.GetFullPath("")
和其他内置方法,但没有得到完整的完整路径。
我有一个路径字符串的一部分,完整路径:"\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"
如何找到一个给定的“路径字符串的一部分”用C#
我想搜索在C以上的路径:与需要得到完整的目录的完整路径。
我试着用Path.GetFullPath("")
和其他内置方法,但没有得到完整的完整路径。
以下是代码: sourceDir将是完整路径。
string defaultFolder = System.AppDomain.CurrentDomain.BaseDirectory;
string navigateToFolder = "\\MVVM\\MyFirstTest2016\\MyFirstTest\\bin\\Debug\\MyFirstTest.exe";
string sourceDir = Path.Combine(defaultFolder, navigateToFolder);
这听起来像你的问题是类似于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)
很明显,这远不是可以运行的,但它应该给你基本的想法。我之前提到的另一个问题也有一个被接受的答案,这将有助于更多。
您可以迭代所有目录并检查子目录是否可用。
正常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
的[?我如何获得大会的代码在路径(可能的复制http://stackoverflow.com/questions/52797 /如何获得该程序集的代码是) – haddow64
否...不是来自大会。以上部分字符串位于C驱动器的某个位置。现在我想识别相同的,并需要使用该部分字符串路径来检索完整的完整路径。 – venkat
'path =“C:”+ path;'? –